查看rxpermission源碼可知,核心代碼是創(chuàng)建一個(gè)無(wú)ui的fragment,fragment是可感知activity生命周期的,這個(gè)時(shí)候,解決方案可不是躍然紙上了嗎,不熟rxjava怎么辦,在下封裝了個(gè)簡(jiǎn)易代碼,僅供參考~
public class PermissionCompat {
public static final int CODE = 200;
/**
* 拒絕,不在詢問(wèn),死了這條心吧~
*/
public static final int DEATH_REFUSAL = 250;
/**
* 一般拒絕,還有機(jī)會(huì)
*/
public static final int NORMAL_REFUSAL = 251;
/**
* 通過(guò)
*/
public static final int PASS = 201;
public interface PermissionCompatCallback {
/**
* @param cmds PASS 通過(guò)|NORMAL_REFUSAL 拒絕 |DEATH_REFUSAL 拒絕(
*/
void ok(int cmds);
void refuse(int cmds);
void goSettings(int cmds);
}
public static abstract class PerCompatCallbackAdpt implements PermissionCompatCallback {
@Override
public abstract void ok(int cmds);
@Override
public void refuse(int cmds) {
}
@Override
public void goSettings(int cmds) {
}
}
public static final String TAG = "fragment";
/**
*/
public static void tryReqs(FragmentActivity act, PerCompatCallbackAdpt mPermissionCompatCallback, String... cmds) {
if (cmds != null && cmds.length > 0) {
List<String> mCmdLists = new ArrayList<>();
for (String cmdStr : cmds) {
mCmdLists.add(cmdStr);
}
for (String cmd : mCmdLists) {
if (ContextCompat.checkSelfPermission(act, cmd) != PackageManager.PERMISSION_GRANTED) {
String[] mPermissions = mCmdLists.toArray(new String[mCmdLists.size()]);
FragmentManager fm = act.getSupportFragmentManager();
ShadowFragment mShadowFragment = (ShadowFragment) fm.findFragmentByTag(TAG);
if (mShadowFragment == null) {
mShadowFragment = new ShadowFragment();
fm.beginTransaction().add(mShadowFragment, TAG).commitAllowingStateLoss();
}
fm.executePendingTransactions();
if (mShadowFragment != null) {
mShadowFragment.mPermissionCompatCallback = mPermissionCompatCallback;
mShadowFragment.requestPermissions(mPermissions, CODE);
}
return;
}
}
if (mPermissionCompatCallback != null) {
mPermissionCompatCallback.ok(PASS);
}
} else {
if (mPermissionCompatCallback != null) {
mPermissionCompatCallback.ok(PASS);
}
}
}
public static boolean hasAllPermissionsGranted(int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
}
public class ShadowFragment extends Fragment {
public PermissionCompat.PermissionCompatCallback mPermissionCompatCallback;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 禁止橫豎屏切換時(shí)的Fragment的重建
setRetainInstance(true);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
System.out.println("###########權(quán)限回調(diào)執(zhí)行啦#############");
System.out.println("###########權(quán)限回調(diào)執(zhí)行啦###########################");
System.out.println("###########權(quán)限回調(diào)執(zhí)行啦#############");
if (mPermissionCompatCallback != null) {
if (PermissionCompat.hasAllPermissionsGranted(grantResults)) {
mPermissionCompatCallback.ok(PermissionCompat.PASS);
} else {
for (String permission : permissions) { //拒絕,并且不在詢問(wèn)
if (!ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), permission)) {
mPermissionCompatCallback.goSettings(PermissionCompat.DEATH_REFUSAL);
return;
}
}
mPermissionCompatCallback.refuse(PermissionCompat.NORMAL_REFUSAL);
}
}
}
}
activity中,一行代馬
PermissionCompat.tryReqs(this, new PermissionCompat.PerCompatCallbackAdpt() {
@Override
public void ok(int cmds) {
System.out.println("==============權(quán)限通過(guò)了==============");
}
@Override
public void refuse(int cmds) {
System.out.println("==============權(quán)限被拒絕了==============");
}
// 還未添加功能
@Override
public void goSettings(int cmds) {
System.out.println("==============請(qǐng)去setting界面==============");
}
}, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE,Manifest.permission.CAMERA);
fragment中,一行代馬
PermissionCompat.tryReqs(getActivity(), new PermissionCompat.PermissionCompatCallbackImplAdpt() {
@Override
public void ok(int cmds) {
System.out.println("==============權(quán)限通過(guò)了老哥==============");
}
}, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE);
僅供參考,還可以封裝的,可視我不會(huì)啦~
看看回掉函數(shù)名字起的,哎吆我去,,,,,真是又臭又長(zhǎng)~
類庫(kù)地址覺(jué)得有用,賞個(gè)star,多謝~
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。