![]() |
想在武汉找工作 |
最近学习Android,看《第一行代码 Android》,到第四章“广播”的时候书后有一个例子,是强制下线。可以参见这篇博客,和书上一样:http://blog.csdn.net/yyywyr/article/details/38615005
我按照书上的例子填上代码,广播的接收类ForceOfflineReceiver中弹出TYPE_SYSTEM_ALERT类型的对话框,但是每次点击按钮发送广播,转到广播的接收onReceive()应该弹出该对话框时,就出现异常APP异常退出,提示没有权限“permission denied for this window type”。但是我在AndroidManifest.xml 中已经添加了<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
这是怎么回事??我用的android SDK是最新的6.0,网上查了半天也没清楚原因。请懂行的帮忙看看!!多谢了!!!
public class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("Warning");
dialogBuilder.setMessage("You are forced to be offline. Please try to login again.");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll(); // 销毁所有活动
Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent); // 重新启动LoginActivity
}
});
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
09-08 02:00:11.608: E/AndroidRuntime(2179): FATAL EXCEPTION: main
09-08 02:00:11.608: E/AndroidRuntime(2179): Process: com.example.broadcastbestpractice, PID: 2179
09-08 02:00:11.608: E/AndroidRuntime(2179): java.lang.RuntimeException: Unable to start receiver com.example.broadcastbestpractice.ForceOfflineReceiver: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@7d2670d -- permission denied for this window type
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2732)
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.app.ActivityThread.-wrap14(ActivityThread.java)
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.os.Handler.dispatchMessage(Handler.java:102)
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.os.Looper.loop(Looper.java:148)
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.app.ActivityThread.main(ActivityThread.java:5417)
09-08 02:00:11.608: E/AndroidRuntime(2179): at java.lang.reflect.Method.invoke(Native Method)
09-08 02:00:11.608: E/AndroidRuntime(2179): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
09-08 02:00:11.608: E/AndroidRuntime(2179): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
09-08 02:00:11.608: E/AndroidRuntime(2179): Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@7d2670d -- permission denied for this window type
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.view.ViewRootImpl.setView(ViewRootImpl.java:591)
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
09-08 02:00:11.608: E/AndroidRuntime(2179): at android.app.Dialog.show(Dialog.java:319)
09-08 02:00:11.608: E/AndroidRuntime(2179): at com.example.broadcastbestpractice.ForceOfflineReceiver.onReceive(ForceOfflineReceiver.java:29)
Android小白,基本同意楼上的观点
可能是因为给的是这个<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
调用的是WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
@tracymcladdy
@zhouever 不好意思各位,这个是我后来改的。我用的是TYPE_SYSTEM_ALERT 和 申请的<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 权限,程序异常。
后来改成TYPE_SYSTEM_OVERLAY和申请 <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> 权限,也是异常。。。。
上面的主题的代码是我改成TYPE_SYSTEM_OVERLAY后复制的,已经修改了。辛苦各位。。还请帮忙再看下。。
@WXB506 android 6.0的权限控制改了,不能直接通过 <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> 申请。你把模拟器和SDK改成6.0以下的版本就好了。
至于6.0的权限控制改成什么样了,还没深入研究过。
@wangpugod2003 thx,我晚上回去试试
过早客微信公众号:guozaoke • 过早客新浪微博:@过早客 • 广告投放合作微信:fullygroup50 鄂ICP备2021016276号-2 • 鄂公网安备42018502001446号