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;
}
}
}
可以看出我們使用集合來批量申請權限,只要有一個失敗則都不能使用。
你是不是有學會一招批量聲明權限的方法呢,如果有問題請留言。