Re: [問題] 小米 關於檢查pop-window權限是否開啟

作者: danny2529 (chihche)   2015-07-08 01:29:12
※ 引述《issuemylove (NotLove)》之銘言:
: 想請問大大們
: 最近寫了個有浮動視窗功能的應用
: 但是小米手機在 pop-window 的部份需要手動開啟權限 (可參考下圖)
: http://imgur.com/9KFJNkP
: 請問有辦法可以得知說
: 該權限是否開啟了嗎?
: PS. 我是有在activity呼叫
: checkCallingOrSelfPermission(permission.SYSTEM_ALERT_WINDOW) 相關的code
: 但是該小米手機中的pop-window跟 system_alert_window相關的權限好像無關
: 無法靠它為依據 或是我哪邊搞錯了QQ
: 謝謝大大們的指點!
前陣子也為了這鬼東西煩惱...於是終於在對岸找到一個比較好的solution
會用到AppOpsManager來做檢查,這東西是API 19之後的
當然小米也是在19之後才有這鬼東西
方法如下
/**
* 判斷小米pop-up權限是否打開
* @param context
* @return boolean
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean isMiuiFloatWindowOpAllowed(Context context) {
final int version = Build.VERSION.SDK_INT;
if (version >= 19) {
//AppOpsManager.OP_SYSTEM_ALERT_WINDOW = 24
return checkOp(context, 24);
} else {
if ((context.getApplicationInfo().flags & 1<<27) == 1) {
return true;
} else {
return false;
}
}
}
/**
* 檢查某權限是否開啟
* @param context
* @param op 權限代號
* @return boolean
* */
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean checkOp(Context context, int op) {
final int version = Build.VERSION.SDK_INT;
if (version >= 19) {
AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
Class clazz = AppOpsManager.class;
Method dispatchMethod = clazz.getMethod("checkOp", new Class[] { int.class, int.class, String.class });
int mode = (Integer) dispatchMethod.invoke(manager, new Object[] { op, Binder.getCallingUid(), context.getApplicationContext().getPackageName() });
if (AppOpsManager.MODE_ALLOWED == mode) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
Log.e(TAG,"Below API 19 cannot invoke!");
}
return false;
}
基本上是這樣,然後檢查時 呼叫isMiuiFloatWindowOpAllowed(mContext)
然後我會在配合一個開應用程式詳細資訊的~做個dialog然後提醒
是就打開(自動跳去應用程式資訊),不要就略過
同場加映,打開應用程式資訊
/**
* 開啟應用程式資訊
* @param context
* @param packageName
*/
public static void showInstalledAppDetails(Context context, String packageName) {
Intent intent = new Intent();
final int apiLevel = Build.VERSION.SDK_INT;
if (apiLevel >= 9) { // 2.3(API 9)以上,使用SDK提供的方法
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", packageName, null);
intent.setData(uri);
} else { // 2.3以下,使用非公开的方法(查看InstalledAppDetails源码)
// 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME也不同,所以分開做。
final String appPkgName = (apiLevel == 8 ? "pkg"
: "com.android.settings.ApplicationPkgName");
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings",
"com.android.settings.InstalledAppDetails");
intent.putExtra(appPkgName, packageName);
}
context.startActivity(intent);
}
以上,希望能幫到你:)
作者: issuemylove (NotLove)   2015-07-08 12:32:00
謝謝分享!!!回去研究~~~!

Links booklink

Contact Us: admin [ a t ] ucptt.com