android 将文件从电脑拷贝到手机文件夹中在APP 中看不到。

222 阅读1分钟

需求是我将 图片拷贝到 SD卡/APictures/ 中,进入APP 的时候,能够看到该文件夹中的图片。

我这边思路是通过查询 EXTERNAL_CONTENT_URI 获取所有的图片,从而显示我拷贝到文件夹中的图片。 但是我发现我拷贝的文件并没有在结果中找到。

  private List<MediaStoreData> queryImages() {
        return query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // 查询URI 
                IMAGE_PROJECTION,
                MediaStore.Images.ImageColumns.DATE_TAKEN,
                MediaStore.Images.ImageColumns._ID,
                MediaStore.Images.ImageColumns.DATE_TAKEN,
                MediaStore.Images.ImageColumns.DATE_MODIFIED,
                MediaStore.Images.ImageColumns.MIME_TYPE,
                MediaStore.Images.ImageColumns.ORIENTATION,
                MediaStoreData.Type.IMAGE);
    }
private List<MediaStoreData> query(
            Uri contentUri,
            String[] projection,
            String sortByCol,
            String idCol,
            String dateTakenCol,
            String dateModifiedCol,
            String mimeTypeCol,
            String orientationCol,
            MediaStoreData.Type type) {
        final List<MediaStoreData> data = new ArrayList<MediaStoreData>();
        String selection = null;
        String[] selectionArgs = null;
        if (filterType == 0) {
            selection = null;
            selectionArgs = null;
        } else if (filterType == 1) {
            selection = MediaStore.Images.Media.DATA + " like ?";
            String path = getDefaultPath();
            selectionArgs = new String[]{path + "%"};
        } else if (filterType == 2) {
            selection = MediaStore.Images.Media.DATA + " not like ?";
            String path = getDefaultPath();
            selectionArgs = new String[]{path + "%"};
        }


        Cursor cursor =
                getContext()
                        .getContentResolver()
                        .query(contentUri, projection, selection, selectionArgs, sortByCol + " DESC");

        if (cursor == null) {
            return data;
        }
... 省略
}

问题是拷贝的文件必须要进行扫描后才能显示出来,方法如下:

 fun scanFileDir() {
        val saveAs = getDefaultDirPath() // 路径
        val pathArr = arrayOf(saveAs)
        val mineType = arrayOf("*/*")
        MediaScannerConnection.scanFile(MyApplication.instance!!, pathArr, mineType, object :
            MediaScannerConnection.MediaScannerConnectionClient {
            override fun onScanCompleted(path: String?, uri: Uri?) {
                Log.i(TAG, "onScanCompleted")
            }

            override fun onMediaScannerConnected() {
                Log.i(TAG, "onMediaScannerConnected")
            }

        })

主要是调用 MediaScannerConnection.scanFile 进行扫描,我在每次进入应用的时候,进行一次扫描就可以在查询所有文件的时候,得到我拷贝的图片。