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