在小部件中,我使用remoteView.setImageViewUri()
从SDCard显示图像。除MarshMallow外,此策略正常工作:
错误是:
Unable to open content: file:///storage/emulated/0/Android/data/applicaitonPackage/files/file.png
open failed: EACCESS (Permission denied)
很明显这是一个权限问题,但我不知道如何授予窗口小部件容器的权限,理论上(参见注释1)图像已存储在共享存储中。< / p>
注1 :存储图像的目录是Environment.getExternalStorageDirectory()
下的共享存储空间
注意2 :应用程序不适用于MarshMallow并使用targetSdkVersion = 15
注3 :不要回答有关MarshMallow中新运行时权限的说明。我已经知道权限更改了,这不是问题,因为应用程序是针对SDKVersion 15而且应用程序没有访问外部存储的任何问题,问题在于我怀疑它不会出现的小部件容器。 ; t具有权限。
答案 0 :(得分:3)
嗨这里是安装Android M的几个步骤,并记住你也应该在清单文件中声明相同的权限。
步骤1.声明全局变量:
public static final int MY_PERMISSIONS_REQUEST_LOCATION = 0;
步骤2.在主要活动中使用此代码
private void locationpermission() {
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(activity
,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
Manifest.permission.ACCESS_COARSE_LOCATION)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_LOCATION);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
步骤3.在oncreate方法中调用此方法,
locationpermission(); 你可以从这里调用任何权限,你可以在覆盖方法onRequestPermissionsResult中获得每个结果。
三江源
希望这对你有帮助(Y)。
请参考这里的例子
https://www.dropbox.com/s/w29sljy0zpwwm61/MyApplication.zip?dl=0
答案 1 :(得分:2)
@Docs说
在运行时请求权限
从Android 6.0(API级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时。 此方法简化了应用安装过程,因为用户在安装或更新应用时无需授予权限。它还使用户可以更好地控制应用程序的功能;
因此,尽管您在清单中声明了权限但仍然获得了拒绝权限
,这是有道理的我建议你阅读如何获得运行时权限
http://developer.android.com/training/permissions/requesting.html
以下是Docs提供的示例
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
根据您的要求更改权限
希望它引导你走向正确的方向
答案 2 :(得分:0)
您的清单文件中是否有此权限?
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
答案 3 :(得分:0)
如果我将targetSdkVersion
设置为15而不是23 - 那么Android M用户是否会看到该应用并能够下载它(在运行时授予所有权限)?
是的,该应用将可供M用户使用,并且每个权限都会在安装时授予。
`targetSdkVersion=15`
小于23.User将能够下载应用程序并使用它在运行时授予所有权限。如果要检查权限,请转到设置并授予权限。如果要在运行时使用android M权限模块,则必须将目标SDK版本设置为23。
如果在Android M及更高版本设备上设置 targetSdkVersion=15
,则会崩溃。
如果你想支持android M用户设置
targetSdkVersion=23
和 处理权限运行时。