0

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

<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(权限被拒绝)

4

3 回答 3

2

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

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

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

这意味着您无法从公共存储中读取或写入。但是,您可以访问暴露于即时应用程序的公共内容提供商,例如联系人选择器或照片选择器。

资料来源:官方常见问题解答

于 2017-06-28T13:01:46.613 回答
0

我迟到了回复,希望这会对某人有所帮助

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

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

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

于 2020-04-04T08:35:57.323 回答
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;
}
于 2017-06-28T10:53:39.490 回答