是否可以在Android Nougat上刷新Media Store?

时间:2017-01-23 09:10:00

标签: android

我已将app-private文件夹中的文件复制到PicturesDCIM,我想在我的应用中打开图库窗口小部件并显示这些图像。 但是,我的gallery小部件使用MediaStore id创建了一个缩略图库,并且新添加的图像不会出现在那里。

我尝试了在stackoverflow上建议的所有三个解决方案,以刷新媒体存储并告诉android有关新文件的存在

  1. sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, - 在较新的API中被禁止
  2. 2

    MediaScannerConnection.scanFile(context, 
    new String[]{ pathToFile1, pathToFile2 }, 
    null, // tried also with a String[] with the mimetype, no difference 
    new MediaScannerConnectionClient()
    {
        public void onMediaScannerConnected(){
        }
        public void onScanCompleted(String path, Uri uri){
            // URI is null, and the gallery doesn't display the image
        }
    });
    

    3

    public static void scanFile(Context context, String path, String mimeType ) {
        Client client = new Client(path, mimeType);
        MediaScannerConnection connection =
                new MediaScannerConnection(context, client);
        client.connection = connection;
        connection.connect();
    }
    
    private static final class Client implements MediaScannerConnectionClient {
        private final String path;
        private final String mimeType;
        MediaScannerConnection connection;
    
        public Client(String path, String mimeType) {
            this.path = path;
            this.mimeType = mimeType;
        }
    
        @Override
        public void onMediaScannerConnected() {
            connection.scanFile(path, mimeType);
        }
    
        @Override
        public void onScanCompleted(String path, Uri uri) {
            connection.disconnect();
        }
    }
    

    再次,uri为空

    为什么Android会如此难以执行这种正常的合法行为? 如何在牛轧糖中达到这种效果?

    编辑:我也尝试发送ACTION_MEDIA_SCANNER_SCAN_FILE

    的广播

    我甚至考虑到了这一点: https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en

    所以现在我发送content://而不是file:// URI,但仍然没有!

    EDIT2:

    我试过这个

    public static void scheduleJob(Context context) {
      JobScheduler js =
          (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
      JobInfo job = new JobInfo.Builder(
        MY_BACKGROUND_JOB,
        new ComponentName(context, MyJobService.class))
          .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
          .setRequiresCharging(true)
          .build();
      js.schedule(job);
    }
    

    如此处所述

    https://developer.android.com/topic/performance/background-optimization.html

    但是,当我打开我的画廊时,新图像不存在

2 个答案:

答案 0 :(得分:3)

原来我试图扫描我复制到另一个地方然后删除的文件的路径,而不是新创建的文件的路径。

结合使用媒体扫描程序和ACTION_MEDIA_SCANNER_SCAN_FILE并尝试扫描正确的文件,我能够刷新媒体商店。

答案 1 :(得分:3)

我正在做类似的事情,它也在 Nougat 中工作。每当我调用getFilePaths();方法时,它会返回手机存储中存在的所有图像的新ArrayList。 -

public ArrayList<String> getFilePaths()
{

    Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    String[] projection = {MediaStore.Images.ImageColumns.DATA};
    Cursor c = null;
    SortedSet<String> dirList = new TreeSet<String>();
    ArrayList<String> resultIAV = new ArrayList<String>();

    String[] directories = null;
    if (u != null)
    {
        c = getContentResolver().query(u, projection, null, null, null);
    }

    if ((c != null) && (c.moveToFirst()))
    {
        do
        {
            String tempDir = c.getString(0);
            tempDir = tempDir.substring(0, tempDir.lastIndexOf("/"));
            try{
                dirList.add(tempDir);
            }
            catch(Exception e)
            {

            }
        }
        while (c.moveToNext());
        directories = new String[dirList.size()];
        dirList.toArray(directories);

    }

    for(int i=0;i<dirList.size();i++)
    {
        File imageDir = new File(directories[i]);
        File[] imageList = imageDir.listFiles();
        if(imageList == null)
            continue;
        for (File imagePath : imageList) {
            try {

                if(imagePath.isDirectory())
                {
                    imageList = imagePath.listFiles();

                }
                if ( imagePath.getName().contains(".jpg")|| imagePath.getName().contains(".JPG")
                        || imagePath.getName().contains(".jpeg")|| imagePath.getName().contains(".JPEG")
                        || imagePath.getName().contains(".png") || imagePath.getName().contains(".PNG")
                        || imagePath.getName().contains(".gif") || imagePath.getName().contains(".GIF")
                        || imagePath.getName().contains(".bmp") || imagePath.getName().contains(".BMP")
                        )
                {



                    String path= imagePath.getAbsolutePath();
                    resultIAV.add(path);

                }
            }
            //  }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    return resultIAV;


}

现在您将获得所有图像的路径。您可以调用getFilePaths().size();返回图像数量,然后将其与之前的值进行比较。