Android 6.0 动态申请权限

从6.0开始,谷歌从苹果那里学习了iOS的动态申请权限这一套(或者是从其他ROM那里借鉴的)。于是,我们的app就不能安装上就一劳永逸了,需要在运行过程要用到某个权限的时候先检查权限是否获取,否的话还要动态申请。

下面整理用代码说明一下整个过程。首先仍然要在menifest.xml中标明需要申请的权限,这里以读取联系人为例。App需要设置target SDK为23(Android6.0)。

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

在需要用在权限的地方

package com.example.stone.permisson6demo;

import android.Manifest;
   ...

public class MainActivity extends AppCompatActivity {

    // 这里有个坑,一般我们的code会设置为int类型,但是如果这个值设置为大于255的话会报错提示这个code只会用到8 bits!
    private static final char MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 当用户曾经拒绝过授权申请,则系统会建议你explain一下申请权限的原因,弹框说明。
                if (ContextCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                            Manifest.permission.READ_CONTACTS)) {
                        showPermissionDialog();
                    } else {
                        showMessage("不用问直接请求?");
                        // 不用explain的话直接申请了,系统会弹标准的对话框申请,我们要自己设置一个requestCode,后边会用到。
                        ActivityCompat.requestPermissions(MainActivity.this,
                                new String[]{Manifest.permission.READ_CONTACTS},
                                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
                    }
                } else {
                    showMessage("可以看通信录了");
                }
            }
        });
    }

    private void showPermissionDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setPositiveButton("阔以", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.READ_CONTACTS},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);
            }
        }).setNegativeButton("不滴", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                showMessage("搞毛");
            }
        }).setTitle("老子要看通讯录").create().show();
    }

    ...

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        // 判断是否成功授权,不用解释了
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
                if(grantResults.length > 0) {
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        showMessage("阔以读取了");
                    } else {
                        showMessage("尼玛。。。");
                    }
                } else {

                }
                break;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    private void showMessage(String message) {
        Toast.makeText(MainActivity.this,
                message, Toast.LENGTH_SHORT).show();
    }
}

你可能感兴趣的:(android-app)