Сохранить файл во внутреннем хранилище и показать в галерее - PullRequest
0 голосов
/ 03 июня 2018

Я должен сохранить изображение (байт []) во внутренней памяти и сделать его видимым внутри галереи, но следующий код не работает, что не так?файл не сохраняется и показывается в галерее, но ошибка не генерируется

private void saveImageToDisk(final byte[] bytes) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-hh:mm");
    String todayDate = dateFormat.format(new Date());
    Log.d("Foto data: ",todayDate);
    File file = new File(context.getFilesDir(), "image.jpg");
    try (final OutputStream output = new FileOutputStream(file)) {
        output.write(bytes);
        output.close();

    } catch (final IOException e) {
        Log.e("TAG", "Exception occurred while saving picture to storage ", e);
    }



    Log.d("Foto","File salvato"+ file.getAbsolutePath());
    addPicToGallery(file.getPath());

}

private void addPicToGallery(String photoPath) {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File file = new File(photoPath);
    Uri contentUri = Uri.fromFile(file);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Чтобы сохранить изображение во внутреннем хранилище, вы можете использовать следующую функцию:

String saveImage(Context context, Bitmap image) {

    String savedImagePath = null;

    // Create the new file in the external storage
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
            Locale.getDefault()).format(new Date());
    String imageFileName = "JPEG_" + timeStamp + ".jpg";
    File storageDir = new File(
            Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
                    + "/YourAppName");
    boolean success = true;
    if (!storageDir.exists()) {
        success = storageDir.mkdirs();
    }

    // Save the new Bitmap
    if (success) {
        File imageFile = new File(storageDir, imageFileName);
        savedImagePath = imageFile.getAbsolutePath();
        try {
            OutputStream fOut = new FileOutputStream(imageFile);
            image.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
            fOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Add the image to the system gallery
        galleryAddPic(context, savedImagePath);

        // Show a Toast with the save location
        String savedMessage = context.getString(R.string.saved_message, savedImagePath);
        Toast.makeText(context, savedMessage, Toast.LENGTH_SHORT).show();
    }

    return savedImagePath;
}

Эта функция принимает контекст и Bitmap изображение в качестве параметров и возвращает путь к сохраненному файлу.

И чтобы сделать изображение видимым для галереи по умолчанию:

static void galleryAddPic(Context context, String imagePath) {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(imagePath);
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    context.sendBroadcast(mediaScanIntent);
}

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

И я не уверен, нужно ли вам на самом деле создавать FileProvider для этих целей, но если вы это сделаете.

В вас AndroidManifest.xmlвнутри тега <application> используйте следующее:

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="<YOUR.PACKAGE.NAME>.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

и создайте новый каталог ресурсов.Щелкните правой кнопкой мыши «res» >> New Android Resource Directory.Выберите «xml» из выпадающего списка.Затем щелкните правой кнопкой мыши папку xml и создайте файл с именем file_paths, в котором введите:

    <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-cache-path name="my_cache" path="." />
    <external-path name="my_images" path="Pictures/" />
</paths>
0 голосов
/ 03 июня 2018

Сохранить файл во внутреннем хранилище и показать в галерее

Это невозможно, извините.

но следующий код не работает, что не так?

Сторонние приложения, включая MediaStore и галереи, не имеют прав доступа к вашим файлам во внутреннем хранилище .

...