android6.0動態獲取系統許可權
阿新 • • 發佈:2018-11-16
介紹:Google公司在android API23之後為了保護用的隱私和敏感資訊,一些許可權必須要使用者同意才能使用
1、不僅僅靜態註冊還需要動態獲取的許可權
如何獲取呢?
2、獲取的兩種方式
1)可參考時光與夢s的文章
使用文件地址:https://www.jianshu.com/p/c83503f0384d
Git地址:https://github.com/yewei02538/HiPermission
說明:適配市場主流廠商手機,但是華為偶爾有bug
2)可以參考getActivity的文章
使用文件地址:https://www.jianshu.com/p/c69ff8a445ed
Git地址:https://github.com/getActivity/XXPermissions
3、如果使用者點選了拒絕但是沒有勾選不在提示
解決方法:彈出彈框給使用者說明,使用者點選確定再次獲取許可權;引導用在許可權管理介面進行設定
流程圖
4、如何獲取手機廠商
/** * 系統工具類 * Created by zhuwentao on 2016-07-18. */ public class SystemUtil { /** * 獲取當前手機系統語言。 * * @return 返回當前系統語言。例如:當前設定的是“中文-中國”,則返回“zh-CN” */ public static String getSystemLanguage() { return Locale.getDefault().getLanguage(); } /** * 獲取當前系統上的語言列表(Locale列表) * * @return 語言列表 */ public static Locale[] getSystemLanguageList() { return Locale.getAvailableLocales(); } /** * 獲取當前手機系統版本號 * * @return 系統版本號 */ public static String getSystemVersion() { return android.os.Build.VERSION.RELEASE; } /** * 獲取手機型號 * * @return 手機型號 */ public static String getSystemModel() { return android.os.Build.MODEL; } /** * 獲取手機廠商 * * @return 手機廠商 */ public static String getDeviceBrand() { return android.os.Build.BRAND; } /** * 獲取手機IMEI(需要“android.permission.READ_PHONE_STATE”許可權) * * @return 手機IMEI */ public static String getIMEI(Context ctx) { TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Activity.TELEPHONY_SERVICE); if (tm != null) { return tm.getDeviceId(); } return null; } }
切記在AndroidManifest.xml新增許可權(也是動態許可權)
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
5、如何跳轉各個廠商
特別說明:
如果在執行的時候報xxxxxActivity類找不到,就到對應的廠商開發者論壇問下技術客服(如小米開發者平臺等等)
或者把該廠商的跳轉註銷掉,直接走default方法
/** * 跳轉設定頁面 */ import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.support.v7.appcompat.BuildConfig; import android.util.Log; public class JumpPermissionManagement { /** * Build.MANUFACTURER */ private static final String MANUFACTURER_HUAWEI = "Huawei";//華為 private static final String MANUFACTURER_MEIZU = "Meizu";//魅族 private static final String MANUFACTURER_XIAOMI = "Xiaomi";//小米 private static final String MANUFACTURER_SONY = "Sony";//索尼 private static final String MANUFACTURER_OPPO = "OPPO"; private static final String MANUFACTURER_LG = "LG"; private static final String MANUFACTURER_VIVO = "vivo"; private static final String MANUFACTURER_SAMSUNG = "samsung";//三星 private static final String MANUFACTURER_LETV = "Letv";//樂視 private static final String MANUFACTURER_ZTE = "ZTE";//中興 private static final String MANUFACTURER_YULONG = "YuLong";//酷派 private static final String MANUFACTURER_LENOVO = "LENOVO";//聯想 /** * 此函式可以自己定義 * @param activity */ public static void GoToSetting(Activity activity){ switch (Build.MANUFACTURER){ case MANUFACTURER_HUAWEI: Huawei(activity); break; case MANUFACTURER_MEIZU: Meizu(activity); break; case MANUFACTURER_XIAOMI: Xiaomi(activity); break; case MANUFACTURER_SONY: Sony(activity); break; case MANUFACTURER_OPPO: OPPO(activity); break; case MANUFACTURER_LG: LG(activity); break; case MANUFACTURER_LETV: Letv(activity); break; default: ApplicationInfo(activity); Log.e("goToSetting", "目前暫不支援此係統"); break; } } public static void Huawei(Activity activity) { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"); intent.setComponent(comp); activity.startActivity(intent); } public static void Meizu(Activity activity) { Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC"); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); activity.startActivity(intent); } public static void Xiaomi(Activity activity) { Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR"); ComponentName componentName = new ComponentName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity"); intent.setComponent(componentName); intent.putExtra("extra_pkgname", BuildConfig.APPLICATION_ID); activity.startActivity(intent); } public static void Sony(Activity activity) { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity"); intent.setComponent(comp); activity.startActivity(intent); } public static void OPPO(Activity activity) { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); ComponentName comp = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity"); intent.setComponent(comp); activity.startActivity(intent); } public static void LG(Activity activity) { Intent intent = new Intent("android.intent.action.MAIN"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity"); intent.setComponent(comp); activity.startActivity(intent); } public static void Letv(Activity activity) { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); ComponentName comp = new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.PermissionAndApps"); intent.setComponent(comp); activity.startActivity(intent); } /** * 只能開啟到自帶安全軟體 * @param activity */ public static void _360(Activity activity) { Intent intent = new Intent("android.intent.action.MAIN"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); ComponentName comp = new ComponentName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity"); intent.setComponent(comp); activity.startActivity(intent); } /** * 應用資訊介面 * @param activity */ public static void ApplicationInfo(Activity activity){ Intent localIntent = new Intent(); localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= 9) { localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); localIntent.setData(Uri.fromParts("package", activity.getPackageName(), null)); } else if (Build.VERSION.SDK_INT <= 8) { localIntent.setAction(Intent.ACTION_VIEW); localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); localIntent.putExtra("com.android.settings.ApplicationPkgName", activity.getPackageName()); } activity.startActivity(localIntent); } /** * 系統設定介面 * @param activity */ public static void SystemConfig(Activity activity) { Intent intent = new Intent(Settings.ACTION_SETTINGS); activity.startActivity(intent); } }
最後:再次感謝時光與夢s 和getActivity,我們一起成長!