过早客
  • 首页
  • 节点
  • 成员
  • 广告投放
  • 登录
  • 注册

帮忙看个Android简单小例子的问题

IT技术 • wangpugod2003 • 发表于 9 年前 • 最后回复来自 sid • 9 年前

最近学习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)

加入收藏 新浪微博 分享到微信 ❤赞 6568 次点击 1 人赞 0 人收藏

打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

共收到8条回复
Phenomenon 9 年前 #1 赞 0

看起来像是权限或者本地通讯异常的问题

zhouever 9 年前 #2 赞 0

alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
alertDialog.show();
}

你用的type可能需要<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
这个权限

tracymcladdy 9 年前 #3 赞 0

Android小白,基本同意楼上的观点
可能是因为给的是这个<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
调用的是WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY

wangpugod2003 楼主 9 年前 #4 赞 0

@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 9 年前 #5 赞 0

不知道楼主最后是怎么解决这个问题的?我也遇到了相同的问题,谢谢

wangpugod2003 楼主 9 年前 #6 赞 2

@WXB506 android 6.0的权限控制改了,不能直接通过 <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> 申请。你把模拟器和SDK改成6.0以下的版本就好了。
至于6.0的权限控制改成什么样了,还没深入研究过。

WXB506 9 年前 #7 赞 0

@wangpugod2003 thx,我晚上回去试试

sid 9 年前 #8 赞 0

就是权限不够的问题,你试试请求动态权限授予。

请绑定手机号后,再发言,点击此处
Guozaoke.com—源自武汉的高端交流分享社区
相关主题
求推荐一个AI智能体客服
Android手机推荐
有多少人知道华为在AI算力的基础建设上已经超越英伟达了?
请教机器学习人工智能的一个技术问题
搞了个AI 生图的网站,不需要登录,永久免费
[第二波送码]动动嘴皮,AI秒出图!2025最炸裂图标神器:免费生成+手机实时预览
我没房子的时候,每年赚的钱比不上房子每年涨的钱。等我咬牙买了,每年赚的钱,比不上房子每年亏的钱
开发了一个管理 Linux 服务器的桌面可视化管理工具,求蹂躏
社区里有没有对钢架自行车和钢架builder感兴趣的同志
社友们,车险异地投保有了解的吗

过早客微信公众号:guozaoke • 过早客新浪微博:@过早客 • 广告投放合作微信:fullygroup50 鄂ICP备2021016276号-2 • 鄂公网安备42018502001446号