Android mediaScannerConnection.scanFile无法刷新库中的图像

时间:2014-04-16 19:13:07

标签: android android-mediascanner

我应该使用除MediaScannerConnection.scanFile方法之外的其他内容来刷新图库吗?

保存新的jpg后,我运行媒体扫描程序来刷新图库应用程序

        MediaScannerConnection.scanFile(this,
                new String[] { fullname }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Log.d("ExternalStorage", "@@@@ Scanned " + path + ":");
                Log.d("ExternalStorage", "@@@@ -> uri=" + uri);
            }
       });

日志输出显示以下正确输出

  

@@@@ Scanned /data/data/com.mypackage/files/skit_106_01.jpg:

     

@@@@ - > URI =含量://媒体/外部/图像/媒体/ 95

图库应用程序显示无可用媒体

这段代码已经有一段时间了。只有当我针对版本4.4.2创建Android avd以进行进一步测试时才会出现问题。

根据Androids文档,我的代码似乎是刷新图库应用程序的推荐方式,所以这个问题可能与我保存文件的方式有关,其代码如下。

更新

代码检查外部存储可用性并写入外部存储,如果外部存储不可用,它会将文件写入内部存储。

    private void doSave(String fname, boolean doShare) {
        fname = "skit_"+mCurrentSkitId +
                "_"+mSkitManager.getCurrentFrameCount(
                        mCurrentSkitId)+1;
        Log.d(TAG, "@@@@ doSave fName = " + fname + " Current skit id = " + mCurrentSkitId);
        CharSequence text = getResources().getString(R.string.saved_as)
                + " " + fname;
        try {
            Bitmap b = mMainView.getSaveBitmap();
            if (b == null) {
                text = getResources().getString(R.string.save_fail_1);
                ;
                Toast.makeText(this, text, Toast.LENGTH_LONG).show();
                return;
            }
            fname = FileUtils.replaceInvalidFileNameChars(fname);
            String value = fname;
            File folder = FileUtils.getWritableFolder(this);
            /*
             * String folder =
             * Environment.getExternalStorageDirectory().toString() +
             * "/Pictures"; try { folder =
             * Environment.getExternalStoragePublicDirectory
             * (Environment.DIRECTORY_PICTURES).toString(); } catch
             * (NoSuchFieldError e) {
             * 
             * }
             */
            String ext = ".jpg";
            if (mPrefs.getString("format", "JPG").equals("PNG"))
                ext = ".png";
            String fullname = folder.getAbsolutePath() + File.separator + value
                    + ext;
            Map<String, String> hm = new HashMap<String, String>();
            hm.put("filename", fullname);
            FileOutputStream fos;
            if (folder == getFilesDir())
                fos = openFileOutput(value + ext, Context.MODE_WORLD_WRITEABLE);
            else {
                File f2 = new File(fullname);
                fos = new FileOutputStream(f2);
            }
            b.compress(CompressFormat.JPEG, 95, fos);
            fos.close();
            String[] str = new String[1];
            str[0] = fullname;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO) {
                MediaScannerConnection.scanFile(this,
                        new String[] { fullname }, null,
                        new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        Log.d("ExternalStorage", "@@@@ Scanned " + path + ":");
                        Log.d("ExternalStorage", "@@@@ -> uri=" + uri);
                    }
               });
            }
            text = text + value + ext + " "
                    + getResources().getString(R.string.saved_end);
            ;
            mLastSaveName = value;
            setDetailTitle();
            mSkitManager.createFrame(mCurrentSkitId, fullname);
        } catch (Exception e) {
            Map<String, String> hm = new HashMap<String, String>();
            hm.put("text", e.toString());
            e.printStackTrace();
            text = getResources().getString(R.string.save_fail_2)
                    + e.toString();
        } catch (Error e) {
            Map<String, String> hm = new HashMap<String, String>();
            hm.put("text", e.toString());
            e.printStackTrace();
            text = getResources().getString(R.string.save_fail_2)
                    + e.toString();
        }
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    }

检查外部存储可用性的代码如下所示

public static File getWritableFolder(Context context) {
    File folder = context.getFilesDir();
    if (externalStorageAvailable()) {
        try {
            folder = Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
            if (!folder.exists() || !folder.canWrite()) {
                folder = Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
            }
            if (!folder.exists() || !folder.canWrite()) {
                folder = Environment.getExternalStorageDirectory();
            }
        } catch (Exception e) {
            folder = Environment.getExternalStorageDirectory();
        } catch (Error e) {
            folder = Environment.getExternalStorageDirectory();
        }
        if (!folder.exists() || !folder.canWrite()) {
            folder = context.getFilesDir();
        }
    }
    return folder;
}

private static boolean externalStorageAvailable() {
    boolean mExternalStorageAvailable;
    boolean mExternalStorageWriteable;
    String state = Environment.getExternalStorageState();

    if (state.equals(Environment.MEDIA_MOUNTED)) {
        // We can read and write the media
        mExternalStorageAvailable = mExternalStorageWriteable = true;
    } else if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
        // We can only read the media
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
        // Something else is wrong. It may be one of many other states, but
        // all we need
        // to know is we can neither read nor write
        mExternalStorageAvailable = mExternalStorageWriteable = false;
    }
    return mExternalStorageAvailable && mExternalStorageWriteable;
}

如果有人能够选择上述任何可能有助于解决这个问题的漏洞,那就太棒了。

1 个答案:

答案 0 :(得分:3)

我的MediaScannerConnection结果好坏参半,所以我使用的是sendBroadcast方法。我不知道sendBroadcast方法是不是标准/不应该使用但是它适用于我。

public void galleryAddPic(File currentPhotoPath) {  
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    Uri contentUri = Uri.fromFile(currentPhotoPath);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}

同样关于MediaScannerConnectionhttps://stackoverflow.com/a/4825615/1497188