Android 6.0以上權(quán)限拒絕打開(kāi)權(quán)限設(shè)置界面的解決方法
本人使用小米手機(jī),打開(kāi)qq或者微信的時(shí)候,某個(gè)權(quán)限拒絕的話,會(huì)提示你開(kāi)啟,點(diǎn)擊開(kāi)啟會(huì)跳轉(zhuǎn)到app的權(quán)限設(shè)置界面,當(dāng)然了,這是國(guó)內(nèi)系統(tǒng)深層定制的原因,也就是說(shuō)這個(gè)界面原聲的android沒(méi)有的!這里以小米和魅族作為示例講解如何讓用戶手動(dòng)打開(kāi)權(quán)限,當(dāng)然了如果是原聲的android就讓他跳轉(zhuǎn)到應(yīng)用的詳情設(shè)置頁(yè)面(有點(diǎn)坑,因?yàn)槠胀ㄓ脩暨€是不知道怎么整)。
參考了很多零零碎碎的東西,網(wǎng)址已經(jīng)找不到了。。。。。。
ok,第一步是跳轉(zhuǎn)到系統(tǒng)的界面,下面基本上可以從9開(kāi)始考慮了,可以簡(jiǎn)化。
String SCHEME = "package";
//調(diào)用系統(tǒng)InstalledAppDetails界面所需的Extra名稱(用于Android 2.1及之前版本)
final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";
//調(diào)用系統(tǒng)InstalledAppDetails界面所需的Extra名稱(用于Android 2.2)
final String APP_PKG_NAME_22 = "pkg";
//InstalledAppDetails所在包名
final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";
//InstalledAppDetails類名
final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";
Intent intent = new Intent();
final int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts(SCHEME, getPackageName(), null);
intent.setData(uri);
} else { // 2.3以下,使用非公開(kāi)的接口(查看InstalledAppDetails源碼)
// 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。
final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22
: APP_PKG_NAME_21);
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName(APP_DETAILS_PACKAGE_NAME,
APP_DETAILS_CLASS_NAME);
intent.putExtra(appPkgName, getPackageName());
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
第二個(gè),miui,首先你得判斷是miui,親自測(cè)試,MIUI7穩(wěn)定版,MIUI8開(kāi)發(fā)板本可行,工具類下面會(huì)提供下載
if (CheckPhoneSystemUtils.isMIUI()) {
MLog.i("產(chǎn)品/硬件的制造商小米:");
intent.setAction("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", getPackageName());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MediaRecoderService.this, "只有MIUI才可以設(shè)置哦", Toast.LENGTH_SHORT).show();
}
}
第三個(gè),flyme(由于沒(méi)有flyme機(jī)子),采用的云手機(jī)測(cè)試的
else if (CheckPhoneSystemUtils.isFlyme()) {
intent.setAction("com.meizu.safe.security.SHOW_APPSEC");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra("packageName", getPackageName());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MediaRecoderService.this, "只有Flyme才可以設(shè)置哦", Toast.LENGTH_SHORT).show();
}
}
下面是工具類:BuildProperties
public class BuildProperties {
private final Properties properties;
private BuildProperties() throws IOException {
properties = new Properties();
properties.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")));
}
public boolean containsKey(final Object key) {
return properties.containsKey(key);
}
public boolean containsValue(final Object value) {
return properties.containsValue(value);
}
public Set<Map.Entry<Object, Object>> entrySet() {
return properties.entrySet();
}
public String getProperty(final String name) {
return properties.getProperty(name);
}
public String getProperty(final String name, final String defaultValue) {
return properties.getProperty(name, defaultValue);
}
public boolean isEmpty() {
return properties.isEmpty();
}
public Enumeration<Object> keys() {
return properties.keys();
}
public Set<Object> keySet() {
return properties.keySet();
}
public int size() {
return properties.size();
}
public Collection<Object> values() {
return properties.values();
}
public static BuildProperties newInstance() throws IOException {
return new BuildProperties();
}
CheckPhoneSystemUtils
private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code";
private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name";
private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage";
/**
* 檢測(cè)MIUI
*
* @return
*/
public static boolean isMIUI() {
try {
final BuildProperties prop = BuildProperties.newInstance();
return prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null;
} catch (final IOException e) {
return false;
}
}
/**
* 檢測(cè)Flyme
*
* @return
*/
public static boolean isFlyme() {
try { // Invoke Build.hasSmartBar()
final Method method = Build.class.getMethod("hasSmartBar");
return method != null;
} catch (final Exception e) {
return false;
}
}
以上這篇Android 6.0以上權(quán)限拒絕打開(kāi)權(quán)限設(shè)置界面的解決方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android使用BottomNavigationBar實(shí)現(xiàn)底部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Android使用BottomNavigationBar實(shí)現(xiàn)底部導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Android自定義ViewGroup實(shí)現(xiàn)標(biāo)簽浮動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup實(shí)現(xiàn)標(biāo)簽浮動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
Kotlin 嵌套函數(shù)開(kāi)發(fā)技巧詳解
這篇文章主要為大家介紹了Kotlin 嵌套函數(shù)開(kāi)發(fā)技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
android Tween Animation屬性設(shè)置方法實(shí)例
在Android開(kāi)發(fā)中,Animation是用來(lái)給控件制作效果的,本文介紹二種實(shí)現(xiàn)方法2013-11-11
Android IPC進(jìn)程間通信詳解最新AndroidStudio的AIDL操作)
這篇文章主要介紹了Android IPC進(jìn)程間通信的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android自定義控件實(shí)現(xiàn)溫度旋轉(zhuǎn)按鈕效果
這篇文章主要給大家介紹了關(guān)于Android如何通過(guò)自定義控件實(shí)現(xiàn)溫度旋轉(zhuǎn)按鈕的效果,文中通過(guò)思路與方法一步步介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2016-12-12
Android中Android Virtual Device(AVD)使用教程
這篇文章主要介紹了Android中Android Virtual Device(AVD)使用教程,本文還對(duì)使用過(guò)程中發(fā)生的一些錯(cuò)誤給出了處理方法,需要的朋友可以參考下2015-01-01

