Как сохранить картинку в мгновенном приложении
Как сохранить картинку в мгновенном приложении
<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;
}