个人博客系统

环境:Android studio 2.2.1、compileSdkVersion 23、buildToolsVersion "24.0.3"

Android6 SdkVersion 23,app将不会在安装的时候授予权限。取而代之的是,app不得不在运行时一个一个询问用户授予权限。

但是需要注意的是权限询问对话框不会自己弹出来。开发者不得不自己调用。如果开发者要调用的一些函数需要某权限而用户又拒绝授权的话,函数将抛出异常直接导致程序崩溃。另外,用户也可以随时在设置里取消已经授权的权限。

下面用一个简单的拨号列子来说明:

20161018141849.png

1、首先还是需要和以前一样,在AndroidMainfest.xml文件中添加权限

<uses-permission android:name="android.permission.CALL_PHONE" />

2、Java代码

Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:"+num));

注意这个时候,如果直接startActivity(callIntent);会提示如下错误,大意是执行startActivity时所需的权限可能会被用户拒绝,编程人员需要执行checkPermission来判断是否可以执行callIntent。

Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException` less... 

这就需要程序在执行startactivity之前先检测是否具有相关权限,如果没有权限,则通过requestPermissions方法,弹出权限请求对话框,让用户选择是否让应用使用权限,不管是用户同意还是拒绝权限请求,程序都会通过activity的回调方法onRequestPermissionsResult将结果返回。

参考代码:

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_ASK_PERMISSION = 0x01;
    private String num;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText editText = (EditText) findViewById(R.id.edit_num);
        Button callBtn = (Button) findViewById(R.id.but_call);
        callBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                num = editText.getText().toString().trim();
                if (TextUtils.isEmpty(num)) {
                    Toast.makeText(MainActivity.this, "请输入电话号码。", Toast.LENGTH_SHORT).show();
                } else {
                    //判断系统版本,如果版本低于Build.VERSION_CODES.M(<23),则无需做额外的权限处理操作。
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        //判断应用是否具有相关权限,如果已经具有权限的话则直接执行,否则弹出权限请求对话框,让用户选择
                        int hasPermission = MainActivity.this.checkSelfPermission(Manifest.permission.CALL_PHONE);
                        if (hasPermission != PackageManager.PERMISSION_GRANTED) {
                            //发起请求,用户响应后会通过onRequestPermissionsResult返回结果
                            requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE_ASK_PERMISSION);
                        } else {
                            callNum(num);
                        }
                    }
                }
            }
        });


    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_PERMISSION:
                callNum(num);
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    private void callNum(String num)  {
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:" + num));
        if (ActivityCompat.checkSelfPermission(MainActivity.this, 
            Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
            startActivity(callIntent);
        }else{
            Toast.makeText(MainActivity.this, "请求权限失败", Toast.LENGTH_SHORT).show();
        }

    }
}


网站公告
这里是挨踢农民工的博客,欢迎光临,以上为一段测试信息。
生命在于折腾
博客分类
文章归档 更多
网站统计
当前在线人数:12
注册会员数:108
网站总浏览量:161851
文章总数:17
留言总数:9
评论总数:21
分类总数:6
友情链接总数:1