2017-01-23 19 views
10

Skopiowałem pliki z folderu prywatnego aplikacji do Pictures lub DCIM i chcę otworzyć widżet galerii w mojej aplikacji i wyświetlić te obrazy. Jednak mój widget galerii tworzy galerię miniatur wykorzystujących identyfikatory MediaStore, a nowo dodane obrazy nie pojawiają się tam.Czy można odświeżyć Media Store na Android Nougat?

Próbowałem wszystkich trzech rozwiązań sugerowanych na stackoverflow, aby odświeżyć sklep mediów i powiedzieć android o istnieniu nowych plików

  1. sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, - zakazanych w nowszych API

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(); 
    } 
} 

Znowu uri jest null

Dlaczego Android sprawiają, że tak trudno jest wykonać taki normalny, legit działanie? Jak osiągnąć ten efekt w Nougat?

EDIT: Próbowałem też transmisję wysyłania dla ACTION_MEDIA_SCANNER_SCAN_FILE

I nawet wziął pod uwagę to: https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en

Więc teraz Im wysyłania content:// zamiast file:// URI, ale nadal nic!

EDIT2:

Próbowałem to

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); 
} 

jak wyjaśniono tutaj

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

Ale znowu, gdy otwieram moją galerię nowy obraz nie jest

Odpowiedz

2

Okazuje się, że próbowałem zeskanować ścieżkę plik, który skopiowałem do innego miejsca, a następnie usunięto, a nie ścieżkę nowo utworzonego pliku.

Po połączeniu skanera multimedialnego i ACTION_MEDIA_SCANNER_SCAN_FILE i próby zeskanowania odpowiedniego pliku, udało mi się odświeżyć magazyn multimediów.

2

Robię to samo i to działa również w Nougat. Ilekroć wywołuję metodę getFilePaths();, ona zwraca mi świeże ArrayList ze wszystkich obrazów obecnych w pamięci telefonu. -

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; 


} 

Teraz otrzymasz ścieżkę do wszystkich zdjęć. Możesz zadzwonić pod numer getFilePaths().size();, aby zwrócić liczbę zdjęć i porównać ją z poprzednią wartością.

Powiązane problemy