一个高扩展性,移植性的Android6.0动态权限封装。
首先在BaseActivity或BaseFragment进行封装:
package com.example.android6;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
public class BaseActivity extends AppCompatActivity {
//判断是否拥有对应的权限
public boolean hasPermission(String... permissions) {
for (String permission : permissions) {
if ((ContextCompat.checkSelfPermission(this, permission)) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
//权限申请的封装
public void requestPermission(int requestCode, String... permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(permissions, requestCode);
}
}
public static final int EXTERNAL_STORATE_PERIMISSION = 0x01;//读写SD卡权限
public static final int CAMERA_PERMISSION = 0x02;//camera权限
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case EXTERNAL_STORATE_PERIMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doSDCard();
}
break;
case CAMERA_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doCamera();
}
break;
}
}
//读写SD卡业务逻辑,由具体的子类实现
public void doSDCard() {
}
//使用相机业务逻辑,由具体的子类实现
public void doCamera() {
}
}
其次在AndroidManifest中申请对应权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
最后在实际要用到的Activity和Fragment中调用:
package com.example.android6;
import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.tv_external_storage_permission:
if (hasPermission(Manifest.permission.CAMERA)) {
//拥有此权限,那么直接执行业务逻辑
doSDCard();
} else{
//还没有对应权限
requestPermission(BaseActivity.EXTERNAL_STORATE_PERIMISSION, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE});
}
break;
case R.id.tv_camera_permission:
if (hasPermission(Manifest.permission.CAMERA)) {
//拥有此权限,那么直接执行业务逻辑
doCamera();
} else {
//还没有对应权限
requestPermission(BaseActivity.CAMERA_PERMISSION, new String[]{Manifest.permission.CAMERA});
break;
}
}
@Override
public void doSDCard() {
super.doSDCard();
//业务逻辑
}
@Override
public void doCamera() {
super.doCamera();
//业务逻辑
}
}
附上xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_external_storage_permission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读写权限"
android:padding="20dp"
android:background="#ccc"
android:onClick="onClick"
/>
<TextView
android:id="@+id/tv_camera_permission"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="相机权限"
android:padding="20dp"
android:layout_marginTop="30dp"
android:background="#ccc"
android:onClick="onClick"
/>
</LinearLayout>
网友评论