在MarshMallow的Widget中显示来自SDCard的图像

时间:2016-03-21 09:53:03

标签: android android-widget android-6.0-marshmallow

在小部件中,我使用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具有权限。

4 个答案:

答案 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和   处理权限运行时。