Ошибка открытия эмулятора Android: ENOENT (нет такого файла или каталога)

#android #file #android-emulator #storage #android-permissions

#Android #файл #android-эмулятор #Хранение #android-разрешения

Вопрос:

Мне нужна помощь с разрешением на сохранение файла в эмуляторе Android… Я добавил

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" android:required="true" />
  

в AndroidManifest.xml

Мой код для сохранения файла:

    if (requestCode == REQUEST_IMAGE_CAPTURE amp;amp; resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        imageView.setImageBitmap(imageBitmap);
   }

        String root = Environment.getExternalStorageDirectory().toString();


        File myDir = new File(root   "/Img");
        myDir.mkdirs();
        long n = System.currentTimeMillis();
        String fname = "IMG_"   n   ".jpeg";
        file = new File(myDir, fname);
        if (file.exists())
            file.delete();
        try {
            FileOutputStream out2 = new FileOutputStream(file);// here fire exception
            imageBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out2); 
            out2.flush();
            out2.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  

AndroidManifest:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.denis.calculator">
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".InfoActivity"></activity><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
 App Indexing.  See https://g.co/AppIndexing/AndroidStudio for more information. -->
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />


</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" android:required="true" />
  

Есть идеи, пожалуйста?

Комментарии:

1. какое именно исключение у вас есть?

2. ошибка открытия: ENOENT (нет такого файла или каталога)

3. удалите эти строки if (file.exists()) file.delete();

4. все еще не работает :/

5. вы пробовали это на реальном устройстве? эта проблема возникает только на эмуляторе?

Ответ №1:

Решение — понизить версию с Nougat до KitKat! спасибо за советы

Комментарии:

1. И да!! Это решение не будет работать дальше и может привести к неоднозначному поведению вашего приложения в новой ОС.

Ответ №2:

Замените приведенные ниже строки

 String root = Environment.getExternalStorageDirectory().toString();

File myDir = new File(root   "/Img");
  

С

 File myDir = new File(Environment.getExternalStorageDirectory(),"Img");
  

Также удалите приведенные ниже строки из вашего кода

 if (file.exists())
    file.delete();
  

Потому что способ определения имени файла никогда не будет иметь того же имени файла. Поэтому проверка существования файла здесь не имеет значения.

Вы также должны запросить разрешение на запись у пользователя, если ваше приложение будет использоваться для Android 6.0 или выше. Обратитесь к ссылке, приведенной ниже, для получения подробной информации:

https://developer.android.com/training/permissions/requesting.html

Вы можете использовать решение, определенное в библиотеке, которую я недавно создал в этом репозитории, включая демонстрационную версию для разрешения.

https://github.com/eeshan-jamal/DroidLibX

Позже я сделаю его доступным через Maven, но пока вам нужно импортировать модуль библиотеки droidlibx в ваш проект.

Комментарии:

1. все еще нет:/ в этой строке перейдите, чтобы перехватить FileOutputStream out2 = новый FileOutputStream (файл);

2. Да, у меня есть .. на nexus :/

3. Не могли бы вы использовать приложение File Explorer на своем телефоне и проверить, создан ли этот каталог Img внутри корневого каталога или нет?

4. Похоже, что нет

5. Вы должны добавить модель запроса разрешений в свое приложение, перейдя по ссылке в моем ответе. Только определение его в манифесте не сработает для выпусков ОС Android Marshmallow, Nougat и future one. Текущее решение будет работать только до ОС lollipop. Вы можете протестировать на эмуляторе, создав эмулятор, предназначенный для ОС Lollipop.