#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.