Android6.0运行时权限

来源:互联网 发布:安卓源码之家 编辑:程序博客网 时间:2024/06/05 11:01

Android6.0系统中引用了运行时权限功能,从而更好的保护了用户的安全和隐私。

哪些是Android列出的危险权限

权限组名 权限名 CALENDAR READ_CALENDAR / WRITE_CALENDAR CAMERA CAMERA CONTACTS READ_CONTACTS / WRITE_CONTACTS / GET_LOCATION LOCATION ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION MICROPHONE RECORD_AUDIO PHONE READ_PHONE_STATE / CALL_PHONE / WRITE_CALL_LOG / ADD_VOICEMAIL / USE_SIP / PROCESS_OUTGOING_CALLS SENSORS BODY_SENSORS SMS SEND_SMS / RECEIVE_SMS / READ_SMS / RECEIVE_WAP_PUSH / RECEIVE_MMS STORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE

除了这个表里面的权限其他都是普通权限,直接在AndroidManifest.xml中申请即可。

危险权限的申请

1. 在AndroidManifest.xml中声明

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.mengfeijia.playvideotest">    // 这里以写入权限为例    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        ...    </application></manifest>

如果运行在6.0以下的系统上是没有问题的,如果在6.0或者更高的版本上就需要动态申请权限:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private VideoView videoView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!=                PackageManager.PERMISSION_GRANTED){            ActivityCompat.requestPermissions(this,new String[]{                    Manifest.permission.WRITE_EXTERNAL_STORAGE },1);        } else {            initVideoPlay();        }    }    private void initVideoPlay() {        File file = new File(Environment.getExternalStorageDirectory(), "movie.mp4");        videoView.setVideoPath(file.getPath());    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        switch (requestCode){            case 1:                if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){                    initVideoPlay();                } else {                    Toast.makeText(this,"拒绝权限无法使用程序",Toast.LENGTH_SHORT).show();                    finish();                }                break;        }    }    @Override    public void onClick(View view) {        switch (view.getId()){            case R.id.btn_play:                if (!videoView.isPlaying()){                    videoView.isPlaying();                }                break;            case R.id.btn_pause:                if (videoView.isPlaying()){                    videoView.pause();                }                break;            case R.id.btn_stop:                if (videoView.isPlaying()){                    videoView.resume();                }                break;        }    }    @Override    protected void onDestroy() {        super.onDestroy();        if (videoView != null){            videoView.suspend();        }    }}

这样就可以成功使用了。

对于多个权限的写法:

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        List<String> permissionList = new ArrayList<>();        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)                != PackageManager.PERMISSION_GRANTED){            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);        }        if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_PHONE_STATE)!=                PackageManager.PERMISSION_GRANTED){            permissionList.add(Manifest.permission.READ_PHONE_STATE);        }        if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)                != PackageManager.PERMISSION_GRANTED){            permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);        }        if (!permissionList.isEmpty()){            String[] permissions = permissionList.toArray(new String[permissionList.size()]);            ActivityCompat.requestPermissions(MainActivity.this,permissions,1);        }else{            requestLocation();        }    }    private void requestLocation() {        initLocation();        mLocationClient.start();    }    private void initLocation() {        // doSomethings    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        switch (requestCode){            case 1:                if (grantResults.length > 0){                    for(int result : grantResults){                        if (result != PackageManager.PERMISSION_GRANTED){                            Toast.makeText(this,"必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();                            finish();                            return;                        }                    }                    requestLocation();                } else {                    Toast.makeText(this,"发生为止错误",Toast.LENGTH_SHORT).show();                    finish();                }                break;            default:                break;        }    }}

可以看出我们使用集合来批量申请权限,只要有一个失败则都不能使用。

你是不是有学会一招批量声明权限的方法呢,如果有问题请留言。