2012-12-20 15 views
9

Chcę udostępnić obraz w widoku obrazu.Ale nie chcę zapisać na karcie SD. Ale gdy używam zamiaru dzielić użyłem koduUdostępnianie obrazu android w ImageView bez zapisywania na karcie SD

Intent share = new Intent(Intent.ACTION_SEND); 
       share.setType("image/jpeg"); 
       share.putExtra(Intent.EXTRA_STREAM,Uri.parse(path)); 
       startActivity(Intent.createChooser(share, "Share Image")); 

tutaj ścieżka podana położenie obrazu w sdcard

ale nie chcę zapisać zdjęcie ... czy jest możliwe ..

+0

to Q A wartości odczytu http://stackoverflow.com/questions/9049143/android-share-intent-for-a-bitmap-is-it-possible-not-to- zapisz-to-przed-dzielenie się – Suragch

Odpowiedz

1

Można również udostępnić go jako identyfikator URI dostawcy treści multimedialnej (jeśli obraz jest już w telefonie lub pochodzi z internetu, można udostępnić adres URL (chociaż nie jest to ten sam efekt):

Ale jeśli przyszedł z internetu, a ty bezpośrednio dekodujesz Bitmap, a teraz chcesz udostępnić go jako prawidłowy obraz, tak, naprawdę potrzebujesz pliku!

+2

Nie mogę uwierzyć, że nie da się tego zrobić bez zapisania obrazu do pliku! – Charlires

+0

bez zapisywania na sdcard Jest to możliwe, –

5

udało mi się to zrobić:

File file = new File(getCacheDir(), "screenshot.png"); 
... 
file.setReadable(true, false); 
Uri uri = Uri.fromFile(file); 
... 
intent.putExtra(Intent.EXTRA_STREAM, uri); 

ten sposób zapisać plik w moim katalogu pamięci podręcznej, więc ja nie oszukuję wszelkich folderach publicznych lub w zależności od karty sd jest obecny.

W ten sposób zostanie automatycznie usunięty, jeśli użytkownik usunie moją aplikację, ale użyłem również metody startActivityForResult/onActivityResult, aby usunąć plik i przywrócić jego folder prywatny po zakończeniu udostępniania.

(Osobiście miałem nadzieję znaleźć sposób, aby dzielić strumień bitów i uniknąć etap tworzenia pliku w całości, ale nie sądzę, że jest to możliwe).

[EDIT: Odkryłem to robi” t działa w wersji 2.3.6, gdzie plik musi znajdować się w pliku: /// mnt/sdcard.]

+0

Czy jesteś w stanie udostępnić obraz w Gmailu? Dostałem komunikat o błędzie, gdy próbowałem. –

+0

Jako [ten komentarz] (http://stackoverflow.com/questions/9049143/android-share-intent-for-a-bitmap-is-it-possible-not-to-save-it-prior-sharing/9049212 ? noredirect = 1 # comment48438032_9049212) mówi o Twojej odpowiedzi: "Tworzenie czytelnych na całym świecie plików w wewnętrznej pamięci twojej aplikacji nie jest dobrym pomysłem." Użyj [FileProvider] (http://stackoverflow.com/a/30172247/3681880), aby zrobić to bezpieczniej. – Suragch

+0

Cześć Tom, twoja odpowiedź jest świetna! Czy wiesz, jaka jest minimalna wymagana wersja interfejsu API, aby to działało, tzn. Czy będzie działać pod kontrolą systemu Android 3.0+? Dziękuję Ci. – middlehut

16

Zalecaną metodą udostępniania plików innym aplikacjom jest ContentProvider pod nazwą FileProvider. Dokumentacja jest całkiem dobra, ale niektóre części są trochę trudne. Oto podsumowanie.

Ustaw FileProvider w manifeście

<manifest> 
    ... 
    <application> 
     ... 
     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.example.myapp.fileprovider" 
      android:grantUriPermissions="true" 
      android:exported="false"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/filepaths" /> 
     </provider> 
     ... 
    </application> 
</manifest> 

Wymień com.example.myapp z nazwą aplikacji pakietu.

Tworzenie RES/XML/filepaths.xml

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <cache-path name="shared_images" path="images/"/> 
</paths> 

Mówi to FileProvider gdzie uzyskać pliki do dzielenia się (za pomocą katalogu pamięci podręcznej w tym przypadku).

Zapisz obraz do pamięci wewnętrznej

// save bitmap to cache directory 
try { 

    File cachePath = new File(context.getCacheDir(), "images"); 
    cachePath.mkdirs(); // don't forget to make the directory 
    FileOutputStream stream = new FileOutputStream(cachePath + "/image.png"); // overwrites this image every time 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    stream.close(); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Podziel obraz

File imagePath = new File(context.getCacheDir(), "images"); 
File newFile = new File(imagePath, "image.png"); 
Uri contentUri = FileProvider.getUriForFile(context, "com.example.app.fileprovider", newFile); 

if (contentUri != null) { 

    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file 
    shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri)); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri); 
    startActivity(Intent.createChooser(shareIntent, "Choose an app")); 

} 

Dalsza lektura

Powiązane problemy