【问题标题】:How to save picture in instant app如何在即时应用中保存图片
【发布时间】:2017-06-28 10:47:21
【问题描述】:

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

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

【问题讨论】:

    标签: android android-instant-apps


    【解决方案1】:

    您无法直接在 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
    

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

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

    来源:官方FAQhere

    【讨论】:

    【解决方案2】:

    将此代码应用于您的相机活动以获得权限

    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;
    }
    

    【讨论】:

    • 相机权限已授予,相机可以预览,但拍照时无法保存
    • 这种情况需要验证图片保存路径格式
    • 当我只请求 WRITE_EXTERNAL_STORAGE 权限时,无法显示对话框。可能是即时应用无法使用存储。
    • 在即时应用程序中,您还需要将图像保存在特定位置..我可以看到您的总保存过程
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多