Я пытаюсь получить исходный код очень простого приложения для камеры на Android Studio 3.4.1 с API виртуального устройства Android (AVD) Nexus 7 (2012) 29. Я сделал снимок с помощью камеры в эмуляторе и попытался сохранить это как /storage/emulated/0/Pictures/myPic.png, но получил исключение из /storage/emulated/0/Pictures/myPic.png open fail: EACCES (Permission Denied). Я испробовал все советы, доступные в Интернете, например:
- В AndroidManifest.xml я добавил:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- В MainActivity.java я добавил следующую проверку прав доступа и код запроса:
public class MainActivity extends Activity {
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
public static void verifyStoragePermissions(Activity activity) {
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
boolean checkPermission = (permission == PackageManager.PERMISSION_GRANTED);
Toast toastPermission = Toast.makeText(activity,
"Is permission granted? " + checkPermission,
Toast.LENGTH_SHORT);
LinearLayout toastLayoutPermission = (LinearLayout) toastPermission.getView();
TextView toastTVPermission = (TextView) toastLayoutPermission.getChildAt(0);
toastTVPermission.setTextSize(30);
toastPermission.show();
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
- Затем я проверяю и запрашиваю разрешение как в onCreate, так и непосредственно перед тем, как хочу сохранить изображение, следующим образом:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
verifyStoragePermissions(this);
......
private void saveImageToFile(File file)
{
if (mCameraBitmap != null)
{
FileOutputStream outStream = null;
verifyStoragePermissions(this);
try
{
outStream = new FileOutputStream(file);
...
}
catch (Exception e)
{
Toast toastException = Toast.makeText(MainActivity.this,
"Exception: " + e.getMessage(),
Toast.LENGTH_SHORT);
LinearLayout toastLayoutException = (LinearLayout) toastException.getView();
TextView toastTVException = (TextView) toastLayoutException.getChildAt(0);
toastTVException.setTextSize(30);
toastException.show();
}
...
- Я также проверил разрешение хранилища вручную в эмуляторе, чтобы убедиться, что доступ к хранилищу разрешен.
Однако, ни один из советов не работает!
Код сгенерировал исключение
/ storage / emulated / 0 / Pictures / myPic.png открыть не удалось: EACCES (В доступе отказано)
когда он достиг линии
outStream = new FileOutputStream(file);
Есть идеи для дальнейшего решения? Большое спасибо.