Как сохранить картинку в мгновенном приложении

Как сохранить картинку в мгновенном приложении

<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 (В доступе отказано)

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

Любое другое разрешение потребует установленной версии вашего приложения.

Это означает, что вы не можете читать или писать из общего хранилища. Однако вы можете получить доступ к общедоступному контент-провайдеру, доступному для мгновенных приложений, таких как сборщики контактов или сборщики фотографий.

Источник: Официальный FAQ здесь

Я опаздываю на ответ, надеюсь, это кому-то поможет

Как уже упоминалось, WRITE_EXTERNAL_STORAGE имеет уровень защиты: опасно, поэтому вы не можете его использовать. Однако вы можете использовать кэш для сохранения изображений.

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

Предупреждение: используйте его с умом, поскольку столкновение с OOM было бы неизбежным, если есть несколько изображений.

Примените этот код к вашей камере, чтобы получить разрешения

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;
}
Другие вопросы по тегам