Android с помощью медиа-сканера для SD-карты - PullRequest
0 голосов
/ 11 апреля 2011

привет всем я пытаюсь сохранить изображение на SD-карту, и у меня возникла проблема с использованием медиа-сканера для сканирования нового сохраненного файла, чтобы он сразу был доступен

ошибки в следующих строках

new String[] { file.toString() }, null, // error: file cannot be resolved

new MediaScannerConnection.OnScanCompletedListener() { 
// error: MediaScannerConnection.OnScanCompletedListener cannot be resolved to a type

это мой код:

public void saveToSDCard(Bitmap bitmap, String name) {
        boolean mExternalStorageAvailable = false;
        boolean mExternalStorageWriteable = false;
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            mExternalStorageAvailable = mExternalStorageWriteable = true;
            Log.v(TAG, "SD Card is available for read and write "
                    + mExternalStorageAvailable + mExternalStorageWriteable);
            saveFile(bitmap, name);
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            mExternalStorageAvailable = true;
            mExternalStorageWriteable = false;
            Log.v(TAG, "SD Card is available for read "
                    + mExternalStorageAvailable);
        } else {
            mExternalStorageAvailable = mExternalStorageWriteable = false;
            Log.v(TAG, "Please insert a SD Card to save your Ad "
                    + mExternalStorageAvailable + mExternalStorageWriteable);
        }
    }

    private void saveFile(Bitmap bitmap, String name) {

        String filename = name;
        ContentValues values = new ContentValues();
        File sdImageMainDirectory = new File(Environment
                .getExternalStorageDirectory(), getResources().getString(
                R.string.directory));
        sdImageMainDirectory.mkdirs();
        File outputFile = new File(sdImageMainDirectory, filename);
        values.put(MediaStore.MediaColumns.DATA, outputFile.toString());
        values.put(MediaStore.MediaColumns.TITLE, filename);
        values.put(MediaStore.MediaColumns.DATE_ADDED, System
                .currentTimeMillis());
        values.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
        Uri uri = this.getContentResolver().insert(
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,

                values);
        try {
            OutputStream outStream = this.getContentResolver()
                    .openOutputStream(uri);
            bitmap.compress(Bitmap.CompressFormat.PNG, 95, outStream);

            outStream.flush();
            outStream.close();
        // this is where im having the problem  
        // Tell the media scanner about the new file so that it is
            // immediately available to the user.
            MediaScannerConnection.scanFile(this,
                    new String[] { file.toString() }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.v("ExternalStorage", "Scanned " + path + ":");
                    Log.v("ExternalStorage", "-> uri=" + uri);
                }
            });
        } catch (IOException e) {
            // Unable to create file, likely because external storage is
            // not currently mounted.
            Log.v("ExternalStorage", "Error writing " + file, e);
        }
    }

Ответы [ 4 ]

4 голосов
/ 31 марта 2014

Или можно использовать через намерение:

//Sends a broadcast to have the media scanner scan a file

private void scanMedia(String path) {
    File file = new File(path);
    Uri uri = Uri.fromFile(file);
    Intent scanFileIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
    sendBroadcast(scanFileIntent);
}

См .: Файлы Media Media Scanner с намерением

4 голосов
/ 14 июня 2011

У меня получилось хорошо работать со статическим методом scanFile

А вот мой код:

String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/" + fileName;    
MediaScannerConnection.scanFile(this, new String[] { filePath }, null, null);

Надеюсь, это поможет ...

2 голосов
/ 12 апреля 2011

MediaScannerConnection.OnScanCompletedListener доступен только начиная с уровня API 8. То же самое для варианта scanFile (), который вы пытаетесь использовать. Проверьте ваш minSdkVersion (и targetSdkVersion) в манифесте.

Если вы хотите, чтобы ваше приложение было совместимо с версиями Android до Froyo, то вам следует использовать вариант scanFile (String path, String mimeType) . Это не статично, поэтому вам нужно создать экземпляр и кэшировать соединение, например, в onResume ():

scanner = new MediaScannerConnection(this, null);
scanner.connect();

Затем при каждом сохранении файла:

if (scanner.isConnected())
    scanner.scanFile(someFile, null);

Не забудьте вызвать scanner.disconnect () в onPause ().

0 голосов
/ 13 декабря 2013

Вы используете File file; в своем коде, но у вас нет этого объекта. Вместо этого вы используете File outputFile в другой части кода. Так что вам нужно использовать outputFile.getAbsolutePath() в вашем MediaScannerConnection.scanFile(...).

...