思路很简单,就是我们自定义一个Fragment,每次请求权限,都是用这个fragment去请求所需要的权限,那么回调的地方就固定了(就是会掉这个fragment对应的onRequestPermissionsResult(xxxx)函数中),具体代码如下:
PermissionFragment 类:
package com.example.androidfram.utils;
import android.app.Fragment;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
public class PermissionFragment extends Fragment{
private static final int PERMISSIONS_REQUEST_BACK =142 ;
private PermissionUtil.PermissionsListener permissionsListener;
@RequiresApi(api = Build.VERSION_CODES.M)
public void fetchPermisson(String[] permissonList, final PermissionUtil.PermissionsListener permissionsListener){
this.permissionsListener=permissionsListener;
List<String> mPermissionList = new ArrayList<>();
for (int i=0;i<permissonList.length;i++){
if ((ContextCompat.checkSelfPermission(getContext(), permissonList[i]) != PackageManager.PERMISSION_GRANTED)
|| shouldShowRequestPermissionRationale(permissonList[i])){
mPermissionList.add(permissonList[i]);
}
}
if (mPermissionList.size()>0) {
requestPermissions(permissonList, PERMISSIONS_REQUEST_BACK);
}else {
permissionsListener.permissonApplied();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
permissionsListener.accept(requestCode, permissions, grantResults);
}
}
PermissionUtil 类:
package com.example.androidfram.utils;
import android.app.Activity;
import android.app.FragmentManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import com.example.androidfram.fragments.Fragment;
public class PermissionUtil {
private PermissionFragment permissionFragment;
private final String TAG = "permissionFragment";
public PermissionUtil(Activity activity){
permissionFragment=getRxPermissionsFragment(activity);
}
public PermissionUtil(Fragment fragment){
permissionFragment=getRxPermissionsFragment(fragment.getActivity());
}
//一次性请求多个
@RequiresApi(api = Build.VERSION_CODES.M)
public void fetchPermisson(String[] permissonList, final PermissionsListener permissionsListener){
permissionFragment.fetchPermisson(permissonList,permissionsListener);
}
private PermissionFragment getRxPermissionsFragment(Activity activity) {
PermissionFragment rxPermissionsFragment = findRxPermissionsFragment(activity);
boolean isNewInstance = rxPermissionsFragment == null;
if (isNewInstance) {
rxPermissionsFragment = new PermissionFragment();
FragmentManager fragmentManager = activity.getFragmentManager();
fragmentManager
.beginTransaction()
.add(rxPermissionsFragment, TAG)
.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();
}
return rxPermissionsFragment;
}
private PermissionFragment findRxPermissionsFragment(Activity activity) {
return (PermissionFragment) activity.getFragmentManager().findFragmentByTag(TAG);
}
public interface PermissionsListener{
//申请权限回调接口
void accept(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults);
//权限申请全部通过后的回调接口
void permissonApplied();
}
}
最后就是,那怎么调用呢?
//获取权限
private void initPermission() {
String[] permissonList = new String[]{
Manifest.permission.INTERNET,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.CALL_PHONE,
Manifest.permission.CAMERA
};
if (Build.VERSION.SDK_INT >= 23) {
//权限请求
new PermissionUtil(this).fetchPermisson(permissonList, new PermissionUtil.PermissionsListener() {
@Override
public void accept(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
}
@Override
public void permissonApplied() {
}
});
} else {
}
}