/**
* 打開應(yīng)用權(quán)限設(shè)置界面
*/
@OnClick(R.id.open_permission_setting)
public void requestOpenPermissionSetting() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
// Uri uri = Uri.fromParts("package", getPackageName(), null);
Uri uri1=Uri.parse("package:" + getPackageName());
intent.setData(uri1);
startActivity(intent);
}
1看蚜,對于應(yīng)用的必須權(quán)限,比如讀取手機(jī)狀態(tài)等渴逻,我們的策略是在啟動頁中進(jìn)行申請音诫。如果用戶允許,則繼續(xù)執(zhí)行竭钝,如果拒絕香罐,則退出應(yīng)用。
2庇茫,如果是某些具體功能才會用到的權(quán)限,比如拍照功能啥容,我們的策略是在需要用到的時候再進(jìn)行申請
? ? ? ? ? ?(當(dāng)然是在相機(jī)工具類中統(tǒng)一處理的顷霹,如果你們沒有封裝击吱,那就只好每個入口都要判斷了)。
3朵纷,在APP使用過程中,從設(shè)置中更改權(quán)限
特別提醒:在APP使用過程中鞋仍,從設(shè)置中更改權(quán)限,應(yīng)用程序會被重啟搅吁。或者說谎懦,會被系統(tǒng)Kill掉然后重新啟動一個新的界拦,當(dāng)然它會記住當(dāng)前的任務(wù)棧。所以再切回到我們的APP的時候享甸,還是會停留在你去設(shè)置之前的頁面蛉威,但是進(jìn)程號已經(jīng)變了#→_→#
你需要做的是:
在BaseActivity中檢查必須的權(quán)限,如果是拒絕狀態(tài)瓷翻,直接跳到啟動頁齐帚,重新申請。之后就是啟動頁的流程了对妄。
4,清理fragment摩瞎。
App的某些頁面,如果存在一個或者多個Fragment時,尤其是V4.Fragment,在修改權(quán)限回到該頁面時,如果沒有權(quán)限該頁面會finish掉自己,但是某些手機(jī)會出現(xiàn)Fragment 依舊存在,而且生命周期會正常執(zhí)行,有兩個問題:1.getActivity為空孝常; 2.API請求需要手機(jī)信息權(quán)限,如果后臺拒絕了這個權(quán)限,則會崩掉。所以Activity onCreate時進(jìn)行權(quán)限判斷,如果沒有則將FragmentManager中的Fragment全部移除,禁止進(jìn)行一系列的操作上渴。
/**
* 清理 FragmentManager 中的 Fragment。
* 解決在系統(tǒng)設(shè)置中更改權(quán)限后曹阔,App 被 kill 掉重啟時的 Fragment 狀態(tài)錯誤問題隔披。
* @param activity
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void clearFragmentManagerInsideFragments(Activity activity) {
if (activity instanceof FragmentActivity) {
FragmentManager manager = ((FragmentActivity) activity).getSupportFragmentManager();
int count = manager.getBackStackEntryCount();
List list = manager.getFragments();
int fragmentCount = list == null ? 0 : list.size();
if (list != null) {
for (Fragment fragment : list) {
manager.beginTransaction().remove(fragment).commit();
}
}
}
注意事項
? ? ? ? 權(quán)限申請的回調(diào)時?使用兼容庫來兼容舊版
對于第2條提到的代碼在android 6.0以上運行沒問題奢米,但是23 api之前就不行了,因為沒有那些方法恃慧。v4兼容庫已對這個做過兼容痢士,可以用以下方法代替:
ContextCompat.checkSelfPermission()
被授權(quán)函數(shù)返回PackageManager.PERMISSION_GRANTED,否則返回PackageManager.PERMISSION_DENIED 怠蹂,在所有版本都是如此城侧。
ActivityCompat.requestPermissions()
這個方法在M之前版本調(diào)用,OnRequestPermissionsResultCallback 直接被調(diào)用嫌佑,帶著正確的 PERMISSION_GRANTED或者 PERMISSION_DENIED 屋摇。
ActivityCompat.shouldShowRequestPermissionRationale()
在M之前版本調(diào)用,永遠(yuǎn)返回false炮温。