8

Próbuję zrobić zdjęcia zrobione w aplikacji widocznej w Galerii (aby można je było udostępniać i oglądać poza aplikacją), ale chcę zachować same obrazy znajdują się w katalogu danych aplikacji, więc po usunięciu aplikacji zostają usunięte (są przechowywane w "{sdcard}/Android/data/{appID}/Pictures/{subfolder} /").Utwórz plik obrazu widoczny w Galerii Androida na Lollipop

Mam spojrzał na wiele odpowiedzi i dla starszych wersji Androida oba z następujących rozwiązań pracy, ale nie wydaje się, aby pracować w Lollipop:

MediaScannerConnection.scanFile(this, 
    new String[]{file.toString()}, new String[] { "image/jpeg" }, 
    new MediaScannerConnection.OnScanCompletedListener() { 
     public void onScanCompleted(String path, Uri uri) { 
      Log.i("ExternalStorage", "Scanned " + path + ":"); 
      Log.i("ExternalStorage", "-> uri=" + uri); 
     } 
    }); 

Uri contentUri = Uri.fromFile(file); 
Intent mediaScanIntent = new 
    Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,contentUri); 
sendBroadcast(mediaScanIntent); 

Ja testowałem to w Nexusie 4 (Android 5.0.1) i Nexus 6 (Android 5.1) i to nie działa. Na Nexusie 7 (Android 4.2.2) działa. Wszystkie 3 urządzenia mają plik ".onmedia" w folderze {sdcard}/Android/data/, więc żadne normalne skanowanie nośnika nie powinno ich odebrać ...

Czy ktoś zna pracę, aby to zrobić działa na wszystkich urządzeniach/wersjach Androida? Czy to z powodu pliku noMedia nie działa w pierwszej kolejności i czy Lollipop jest jedyną wersją, która robi to poprawnie?

Edycja: Pamiętaj, że nawet ponowne uruchomienie telefonu (które powinno również spowodować ponowne skanowanie plików) nie działa. I nie bez powodu, ponieważ pliki znajdują się w podfolderze katalogu ".nomedia" ... Zatem każde rozwiązanie zawierające transmisję MEDIA_MOUNTED jest bezużyteczne.

+0

Plz spojrzeć na moją odpowiedź Myślę, że to działa dla Ciebie. – Lokesh

Odpowiedz

6

Spróbuj poniżej kodu.To działa na mnie w Lollipop, Nadzieja pracuje dla Ciebie także

ContentValues values = new ContentValues(); 
values.put(MediaStore.Images.Media.DATA,"file path"); 
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg"); 
mContext.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values); 

EDIT: Nie zapomnij dodać go do manifestu (choć w Lollipop powinno już nie być konieczne):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+1

Dzięki. Obawiałem się, że ta odpowiedź nie działa dla mnie, ale to dlatego, że miałem pozwolenie "zapisuj pamięć zewnętrzną" tylko dla SDK 18 i niższych. Teraz za zgodą wszystkich SDK to działa. Nadal trzeba testować w niższych wersjach Androida, ale jest to przynajmniej idealny początek! – Kasium

+0

Ur wlcm i dziękuję za ur edytuj sugestię. – Lokesh

+0

Mam 100 reputacji więcej tylko dlatego, że wczoraj dużo surfowałem po sieci stackoverflow, właśnie szukając tej NIESAMOWITEJ odpowiedzi. Dziękuję @Lokesh – Leebeedev

2

Proponuję, aby spojrzeć na my answer here. Zawiera on wszystkie odkrycia dokonane wokół MediaScanner, które stworzyłem.

Uwaga boczna: wszystkie problemy z numerem KitKat są również widoczne na Lollipop.

+0

Dzięki. Ale wszystkie nie wydają się być rozwiązaniem. Nawet hack wysyłania "zamontowanego" audycji przez powłokę nie działa ... – Kasium

+0

Prawidłowo. Jak już powiedziałem, nie ma działającego rozwiązania dla KitKat, a także dla Lollipopa. – Sebastiano

0

Nie jestem pewien, czy dostawca zawartości multimedialnej uzyska uprawnienia do odczytu dla lokalnego katalogu z danymi, który zawiera obrazki. Bez uprawnień Twoja galeria nie mogłaby działać.

Aby dowiedzieć się, czy jest możliwe, można spróbować umieścić odnośniki do was lokalnych obrazów na androidy bazie samemu medialnej poprzez

mMediaProvider = mContext.getContentResolver().acquireProvider("media"); 
    mImagesUri = Images.Media.getContentUri(volumeName); 
    result = mMediaProvider.insert(mImagesUri, values); 

Oto sourcecode skanera mediów, które powinny zawierać wszystkie neccessary fragmenty kodu jak wypełnić wartości z jpg

0

Po zapisaniu imag e wywołaj metodę skanowania, aby zeskanować galerię, pokaże obrazy w galerii.

scanFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/appfolder/imgname"+imagenumber+".png"); 


private void scanFile(String file) { 


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


    } 
+0

To jest dokładnie to, co już powiedziałem NIE działa w pierwotnym pytaniu ... – Kasium

+0

musisz odświeżyć ten określony plik, a następnie tylko jego prace, Testowane w Nexusie 5, 5.0.2 .. jego działanie, –

+0

Myślałem o po drugie może to być różnica polegająca na tym, że używasz bezwzględnej ścieżki zamiast pliku file.toString(), ale wciąż z file.getAbsolutePath() to nie działa na moim Nexusie 4, 5.0.1 chociaż dziennik mówi, że został zeskanowany : I/ExternalStorage: Skanowany /storage/emulated/0/Android/data/com.something/files/Pictures/10141/7657/RZ-1430906494186.jpg: I/ExternalStorage: -> uri = content: // media/external/file/43992 Jakiej aplikacji używasz do sprawdzania galerii? Próbowałem Googles "Zdjęcia" i Telegram (udostępnij zdjęcie). – Kasium

0

Jak pan powiedział, że {} sdcard/Android/data/ folder zawiera plik .nomedia, to możemy wysłać transmisję na MediaScanner skanować podfoldery folderu zawierające .nomedia plik określając tę ​​ścieżkę podfolderu za pomocą poniższego kodu.

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file:// "+"Directory path")));