安卓学者请教各位大哥们:我的代码出现了哪里的问题 当我需要系统弹出一个系统对话框的时候老是报错
代码如下:这是我在Mainfest中注册的内容
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wangsj.broadcastbestpractice"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".LoginActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".MainActivity">
</activity>
<receiver android:name=".ForceOfflineReceiver">
<intent-filter>
<action android:name="com.example.broadcastbestpractice.FORCE_OFFLINE"/>
</intent-filter>
</receiver>
</application>
</manifest>
这是我在函数中调用系统对话框的的代码
public class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder dialogBulider = new AlertDialog.Builder(context);
dialogBulider.setTitle("Warning");
dialogBulider.setMessage("You are forced to be offline . Please try login again");
dialogBulider.setCancelable(false);
dialogBulider.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
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);
}
});
AlertDialog alertDialog = dialogBulider.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
我的模拟器用的是android6.0 api用的是23 我已经仔细核对了代码与《第一行代码》中的代码完全相同,为什么我的不能运行成功求解释。新人c币不多,请个各位大侠行行好
android6.0需要申请权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.SYSTEM_OVERLAY_WINDOW) != PackageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.SYSTEM_OVERLAY_WINDOW) != PackageManager.PERMISSION_GRANTED) {
String[] permissions = new String[]{Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.SYSTEM_OVERLAY_WINDOW};
ActivityCompat.requestPermissions(this, permissions, 10);
return;
}
}
重写
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
loge(TAG, "requestCode" + requestCode + "permissions"+ Arrays.toString(permissions)+"grantResults"+Arrays.toString(grantResults));
}
可以看到申请是否成功
要显示出来也很简单,把下面这句话屏蔽了应该就可以了。这句话用的权限级别比较高,一般系统电量提示的那种对话框都用的这种权限。
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
在没有了解6.0的情况下,建议不要使用那么高的版本,关于权限:http://www.w2bc.com/article/android-6-0-runtime-permission
19以上 推荐是用 toast模式 不要使用TYPE_SYSTEM_ALERT
我也是这个问题,你解决了吗?
当targetSdkVersion=23时,4.4版本的模拟器正常运行,但是界面显示有点不正常,5.0根本无法启动,6.0和N可以启动但是不可以创建对话框,截图如下:
一个解决办法是将targetSdkVersion改成**22**,这样的话改成22的话,4.4模拟器依然正常运行,但界面显示还是有点异常,5.0依然无法启动,6.0和N可以正常运行,界面显示也正常截图如下:
顺便说一句,动态申请权限无效...
解决方法见:
http://www.enjoydiy.com/3554.html
同样遇到了,请问怎么解决的
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
改成
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
c786909486 说的是可以实现的