我目前正在尝试将我的应用程序调整为Android M的新权限模型.
我正在收集我需要的所有权限,然后运行
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
Run Code Online (Sandbox Code Playgroud)
requiredPermissions拥有我需要的权限android.permission.WRITE_EXTERNAL_STORAGE
.
该例程肯定是执行的,因为我在logcat中有Log行:
08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE
Run Code Online (Sandbox Code Playgroud)
但是权限对话框从不显示,更不用说调用onRequestPermissionsResult()了.
我究竟做错了什么?基于一些教程,我发现我没有遗漏任何东西.我只有用于测试的模拟器,没有物理设备.这是关于设置的屏幕: 图像
可能值得一提的是:如果我尝试从主屏幕打开已安装应用程序的概述,我只会得到launcher3 has exited
.我不确定这可能是相关的.
有没有人知道它为什么没有显示?
我想以编程方式更改系统亮度.为此我使用此代码:
WindowManager.LayoutParams lp = window.getAttributes();
lp.screenBrightness = (255);
window.setAttributes(lp);
Run Code Online (Sandbox Code Playgroud)
因为我听说最大值是255.
但它什么都没做.请建议任何可以改变亮度的东西.谢谢
我正在尝试ConnectivityManager.bindProcessToNetwork(Network)
使用新的ConnectivityManager.requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)
原因是强制应用程序在某个特定网络中调用未来请求,该网络没有互联网连接(它是本地硬件通信网络).此时,系统正在通过3G/4G网络发送请求,并且永远不会到达所需的Wifi网络,因为此网络不响应android调用的连接检查.
当我调用该requestNetwork
方法时,我收到以下错误:
java.lang.SecurityException: com.xyz.app was not granted either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.
Run Code Online (Sandbox Code Playgroud)
我尝试调用新方法来请求Android 6.0中可用的权限:
requestPermissions(new String[]{Manifest.permission.CHANGE_NETWORK_STATE, Manifest.permission.WRITE_SETTINGS}, PERMISSIONS_REQUEST_WIFI);
Run Code Online (Sandbox Code Playgroud)
但回调总是如此PackageManager.PERMISSION_DENIED
.
我把这两个权限都放在了AndroidManifest.xml
,没有成功.
注意:Manifest.permission.WRITE_SETTINGS
它不在权限组中.
从下面的清单中可以看出,我已经添加了许可,我错过了什么?
<uses-permission-sdk-m android:name="android.permission.WRITE_SETTINGS" />
Run Code Online (Sandbox Code Playgroud) 我正在为Android 6.0 Marshmallow构建我的应用程序,它需要WRITE_SETTTINGS权限.从这里搜索后我才知道这称呼:
requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS},
101);
Run Code Online (Sandbox Code Playgroud)
不会显示对话框权限.因此,基于CommonsWare解决方案,我们应该检查Settings.System.canWrite()
返回true或false.所以,我应该将Activity ACTION_MANAGE_WRITE_SETTINGS
作为动作来调用.
但问题是当我调用此活动时,它显示我的应用程序已被授予权限,尽管该方法Settings.System.canWrite()
返回false.
我在这里遗漏了什么,或者我必须禁用它然后再次启用它.
我记得曾经(在谷歌的一个视频中)告诉我,如果应用程序的先前版本更新为在新版本上拥有targetSdk 23,那么之前授予的所有权限 - 现在都将被授予.
因此,例如,如果你安装了一个带有targetSdk 22的应用程序,那需要一个从联系人那里读取的权限,那么即使在升级了应用程序之后,使用targetSdk 23,也会保持这种状态.
原因很简单:用户在安装时已经授予了权限.
根据我的发现,这个规则有一个例外:
如果您的应用具有SYSTEM_ALERT_WINDOW权限,现在您升级到targetSdk 23,它将被撤销(重置),您需要从该用户请求它.
在文档中的任何位置都没有提到此行为:
而且在我看过的任何视频中都没有.
关于SYSTEM_ALERT_WINDOW权限,唯一提到的是你需要以不同的方式处理它们,使用ACTION_MANAGE_OVERLAY_PERMISSION来请求权限,以及Settings.canDrawOverlays(...)来检查是否授予了权限
我试图联系Google了解这个问题,他们说这是故意的:
我与开发团队进行了交谈,您看到的行为正如预期的那样.这在此处记录:http: //developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW
在Android M中提出了SYSTEM_ALERT_WINDOW的保护级别.
是否有其他权限具有此行为?
如果应用程序有targetSdk 22/23,并且操作系统升级到Android 6,会发生什么?SYSTEM_ALERT_WINDOW(或任何其他权限)是否会被撤销?
很确定其他东西会被授予,但我还是想问:其他类似特权的功能如何:SAF,管理,使用访问,辅助功能访问,通知访问,......?
编辑:关于#2,这是谷歌的答案(链接在这里):
在操作系统升级时,应用程序应保留SYSTEM_ALERT_WINDOW.默认情况下,Pre-API 23应用程序具有权限,而默认情况下禁用API 23应用程序.但是,有一个已知的错误,对于API 23应用程序,它们在升级时会丢失SYSTEM_ALERT_WINDOW.对开发人员的建议是始终在开始时检查SYSTEM_ALERT_WINDOW的状态,如果未授予,则将用户定向到"设置".我们将在未来的版本中修复该问题.
permissions android system-alert-window android-6.0-marshmallow
使用官方AVD rev.3
打电话给:
ActivityCompat.requestPermissions(activity, new String[]{"android.permission.USE_CREDENTIALS"}, REQUEST_PERMISSION_CREDENTIALS);
Run Code Online (Sandbox Code Playgroud)
立即开火:
onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)
Run Code Online (Sandbox Code Playgroud)
结果代码是 PackageManager.PERMISSION_DENIED
任何人都有修复?
更新:已知受影响:
Manifest.permission.CHANGE_NETWORK_STATE
Manifest.permission.WRITE_SETTINGS (solved, see Sam's answer)
android.permission.USE_CREDENTIALS (solved, read Update 2)
READ_SMS
Run Code Online (Sandbox Code Playgroud)
更新2:看到优秀的接受答案.从本质上讲,USE_CREDENTIALS现在是一个安全的许可.打败我为什么sdk不仅仅为它返回PERMISSION_GRANTED ......
在我的应用程序中使用targetSdkVersion为23,同时使用API Settings.System.putString().
正在抛出以下错误并且应用程序崩溃
"AndroidRuntime:java.lang.IllegalArgumentException:您无法将设置保留在安全设置中."
尝试解决方案后
无法获得WRITE_SETTINGS权限
并在ACTION_MANAGE_WRITE_SETTINGS打开的屏幕中授予应用写入权限.该应用仍然会收到错误"您无法将设置保留在安全设置中".
现在仅为OEM开发的应用程序请求WRITE_SETTINGS权限吗?有可能的解决方案吗?
共享示例代码,在具有M OS的Nexus 5设备上进行测试.
android:minSdkVersion="17"
android:targetSdkVersion="23"
uses-permission android:name="android.permission.WRITE_SETTINGS"
Run Code Online (Sandbox Code Playgroud)
protected void onResume() {
super.onResume();
boolean canDo = Settings.System.canWrite(this);
if (false == canDo)
{
Intent grantIntent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
startActivity(grantIntent);
}
else
{
Settings.System.putString(this.getContentResolver(),
"test.hemant", "hemantval");
}
}
Run Code Online (Sandbox Code Playgroud)
E/DatabaseUtils( 779): Writing exception to parcel
E/DatabaseUtils( 779): java.lang.IllegalArgumentException: You cannot keep your settings in the secure settings.
E/DatabaseUtils( 779): at com.android.providers.settings.SettingsProvider.warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk(SettingsProvider.java:1175)
E/DatabaseUtils( 779): at com.android.providers.settings.SettingsProvider.enforceRestrictedSystemSettingsMutationForCallingPackage(SettingsProvider.java:1030)
E/DatabaseUtils( 779): at com.android.providers.settings.SettingsProvider.mutateSystemSetting(SettingsProvider.java:906)
E/DatabaseUtils( 779): …
Run Code Online (Sandbox Code Playgroud) 我正在尝试写一个关于AT的值.我已经在清单中声明了以下所需的许可,
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
Run Code Online (Sandbox Code Playgroud)
并尝试在运行时请求权限,AT显示有关权限设置的窗口.但是,该开关不可点击.关于AT 文件
不支持在运行时请求权限,因为不保证嵌入式设备具有接受运行时对话框的UI.在应用程序的清单文件中声明所需的权限.在应用程序清单中声明的所有正常和危险权限都将在安装时授予.
然而Settings.System.canWrite()
总是回来false
.
是否有任何特殊方法可以启用权限WRITE_SETTINGS
?
我已经进行了广泛的搜索,但找不到类似的问题。
我想知道是否有任何方法可以检测移动设备的屏幕亮度何时发生变化。
我已经尝试在应用程序启动时存储旧值并反复检查Settings.System.getInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS);
用于比较屏幕亮度的初始值和最终值,这不是一个好的方法。
谢谢
编辑:这个问题表明我已经尝试过使用Settings.System.SCREEN_BRIGHTNESS
获取当前屏幕值并定期检查屏幕亮度变化的解决方案。我正在寻找一种更有效的方法来进行这样的操作。