如何在即时应用程序中保存图片

时间:2017-06-28 10:47:22

标签: android android-instant-apps

如何在即时应用中保存图片

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="***">
<uses-permission 
  android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission 
  android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<application android:allowBackup="true"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"/>

EasyPermissions.requestPermissions(this, "11", REQUEST_STORAGE_PERMISSION, Manifest.permission.WRITE_EXTERNAL_STORAGE);
  

java.io.FileNotFoundException:/storage/emulated/0/Android/data/***/files/pic.jpg(Permission denied)

3 个答案:

答案 0 :(得分:2)

您无法直接在Instant Apps中访问存储空间。 它们运行在更高级别的安全SandBox上。 您有权访问的唯一权限如下:

BILLING
ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ACCESS_NETWORK_STATE
CAMERA
INSTANT_APP_FOREGROUND_SERVICE only in Android O.
INTERNET
READ_PHONE_NUMBERS only in Android O.
RECORD_AUDIO
VIBRATE

任何其他权限都需要已安装的应用版本。

这意味着您无法从公共存储中读取或写入。 但是,您可以访问公开内容提供商,这些公开内容提供商会使用即时应用程序,例如联系人拣货员或者是明星。

来源:官方常见问题here

答案 1 :(得分:0)

将此代码应用于相机活动以获取权限

takephoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (hasTakePermissions(getApplicationContext(), PERMISSIONS)) {
                takePicture();
            } else {
                ActivityCompat.requestPermissions(HomeActivity.this, PERMISSIONS, PERMISSION_ALL);
            }
        }
    });

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST_WRITE_PERMISSION:
            if (hasPermissions(getApplicationContext(), PERMISSIONS)) {
                takePicture();
            } else {
                ActivityCompat.requestPermissions(HomeActivity.this, PERMISSIONS, PERMISSION_ALL);
            }
    }
}
    public static boolean hasTakePermissions(Context context, String... permissions) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {

        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

答案 2 :(得分:0)

我迟到了,希望能对某人有所帮助

如前所述,WRITE_EXTERNAL_STORAGE具有保护级别:危险,因此您不能使用它。 但是,您可以使用缓存保存图像。

val outDirectory = File(activity?.cacheDir, "image.jpg")

警告:明智地使用它,因为如果有多个图像,将不可避免地遇到OOM。