您的位置:首页 > 移动开发 > Android开发

Android6.0运行时权限笔记。

2017-04-10 23:47 567 查看
视频链接:点击打开链接

代码

第一步:先写一个activity栈管理类

public class ActivityCollector {
private static List<Activity> activityList = new ArrayList<>();

public static void addActivity(Activity activity) {

activityList.add(activity);
}

public static void removeActivity(Activity activity) {
activityList.remove(activity);

}

public static Activity getTopActivity() {
if (activityList.isEmpty()) {
return null;
} else {
return activityList.get(activityList.size() - 1);
}
}
}

第二步:写一个权限管理接口

public interface PermissionListener {
//  所有权限被允许。
void onGranted();
//  告知调用方那些权限被拒绝了。
void onDenied(List<String > deniedPersission);
}

第三步:写一个BaseActivity

public class BaseActivity extends AppCompatActivity {

private static PermissionListener mLisenter;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
ActivityCollector.addActivity(this);
super.onCreate(savedInstanceState);
}

@Override
protected void onDestroy() {
ActivityCollector.removeActivity(this);
super.onDestroy();
}
//permissions为要申请的权限数组。
public static void requestRuntimePerimission(String[] permissions, PermissionListener lisenter) {
try {
Activity topActivity = ActivityCollector.getTopActivity();
if (topActivity == null) {
return;
}
mLisenter = lisenter;
List<String> permissionLists = new ArrayList<>();
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) {
permissionLists.add(permission);
}
}
if (!permissionLists.isEmpty()) {
ActivityCompat.requestPermissions(topActivity, permissionLists.toArray(new String[permissionLists.size()]), 1);
} else {
mLisenter.onGranted();
}
} catch (RuntimeException e) {
//            activity被回收的时候可能会挂掉。所以加一个try catch
}

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
List<String> deniedPermission = new ArrayList<>();
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
String permission = permissions[i];

if (grantResult != PackageManager.PERMISSION_GRANTED) {
deniedPermission.add(permission);
}
}

if (deniedPermission.isEmpty()) {
mLisenter.onGranted();
} else {
mLisenter.onDenied(deniedPermission);
}
}
break;
}
}
}


使用

如果是在activity中,则使这个activity继承BaseActivity。然后直接调用requestRuntimePermission方法即可。

//1.封装运行时权限--设置成透明的activity盖在上面,在用户确认后哦,将activity finish掉。申请权限的方法必须在activity上展示。
//2.rxpermission 利用透明的fragment来实现
public class PermissionActivity extends BaseActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
initParams();
}
private void initParams() {
findViewById(R.id.btn).setOnClickListener(this);
}

@Override
public void onClick(View view) {
requestRuntimePerimission(new String[]{ Manifest.permission.CALL_PHONE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionListener() {
@Override
public void onGranted() {
//                直接执行要做的操作即可
Toast.makeText(getApplicationContext(),"权限全部允许了",Toast.LENGTH_SHORT).show();
}

@Override
public void onDenied(List<String> deniedPersission) {
//⚠️如果用户点击了拒绝不再提醒,那么只会走这个回调。只能提示用户去设置里允许权限。
for (String s : deniedPersission) {
Toast.makeText(getApplicationContext(),s+"权限被拒绝了",Toast.LENGTH_SHORT).show();
}
}
});
}
}


如果不在activity中

public class Test {

public static void test(final Context context) {
BaseActivity.requestRuntimePerimission
(new String[]{Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionListener() {
@Override
public void onGranted() {
//                直接执行要做的操作即可
Toast.makeText(context, "权限全部允许了", Toast.LENGTH_SHORT).show();
}

@Override
public void onDenied(List<String> deniedPersission) {

for (String s : deniedPersission) {
Toast.makeText(context, s + "权限被拒绝了", Toast.LENGTH_SHORT).show();
}
}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息