#java #android #file #storage #android-10.0
#java #Android #файл #Хранение #android-10.0
Вопрос:
Когда я делаю снимок, я сохраняю изображение в папке DCIM / Camera во внешней папке с помощью этого метода:
Способ 1:
File fImage = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) "/Camera/image.jpg");
ContentResolver resolver = activity.getContentResolver();
Uri imageUri = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID ".provider", fImage);
if(imageUri != null) {
OutputStream fos = resolver.openOutputStream(imageUri);
if(fos != null) {
fos.write(bytes, 0, bytes.length);
fos.flush();
fos.close();
new SingleMediaScanner(activity, fImage);
}
}
Способ 2:
File fImage = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) "/Camera/image.jpg");
OutputStream outputStream=null;
try {
outputStream=new FileOutputStream(fImage);
outputStream.write(bytes);
}finally {
if (outputStream != null)
outputStream.close();
new SingleMediaScanner(activity, fImage);
}
Мой файл присутствует на планшете в нужной папке.
Мой провайдер содержит это:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
В моем манифесте есть это:
<uses-sdk
android:minSdkVersion="22"
android:targetSdkVersion="30" />
...
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
<application
...
android:requestLegacyExternalStorage="true"
android:preserveLegacyExternalStorage="true">
...
</application>
Мой класс, разрешающий сканирование файлов:
public static class SingleMediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {
private MediaScannerConnection mMs;
private File mFile;
public SingleMediaScanner(Context context, File f) {
mFile = f;
mMs = new MediaScannerConnection(context, this);
mMs.connect();
}
@Override
public void onMediaScannerConnected() {
String extension = FilenameUtils.getExtension(mFile.getAbsolutePath()).toLowerCase();
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
String mimeType = mimeTypeMap.getMimeTypeFromExtension(extension);
mMs.scanFile(mFile.getAbsolutePath(), mimeType);
}
@Override
public void onScanCompleted(String path, Uri uri) {
mMs.disconnect();
}
}
После этого сканирования созданный мной файл удаляется. И значение uri равно нулю в onScanCompleted .
Вы знаете почему ?
Отредактировано: я тестировал на Samsung Tab A, и проблем нет. Но на Archos T101X4G это не работает.
Комментарии:
1. @blackapps Я добавил строку отсутствующего вызова mediascanner в функцию.
2.
if(fos != null)
И если fos==null, вы можете отобразить всплывающее окно, чтобы пользователь знал, что что-то пошло не так.3. @blackapps да, но в моем случае проблем нет, файл действительно создан на планшете. Я вижу это, подключив планшет к ПК. Но если я вызываю SingleMediaScanner, файл исчезает.
4. @blackapps я добавляю строку: новый единый медиасканнер (активность, изображение);
5. Проверено. Здесь этого не происходит. Получен хороший uri.
Ответ №1:
В конце концов, я думаю, что проблема возникает только с планшета Archos: я только что протестировал с WhatsApp, и изображение, загруженное в WhatsApp, также исчезает…