2012-12-20 130 views
9

我想分享圖像中的圖像view.but但我不想保存到SDcard。 但是當我使用意向分享我以前在SD卡android在ImageView中共享圖像而不保存在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")); 

此路徑指定圖像的位置,但我不想保存的圖片有可能..

+0

這個Q&A是值得一讀http://stackoverflow.com/questions/9049143/android-share-intent-for-a-bitmap-is-it-possible-not-to-保存之前共享 – Suragch

回答

1

您也可以將其作爲媒體庫內容提供者URI共享(如果圖像已經在手機上,或者它來自網絡,則可以共享該URL(雖然效果不一樣)。

但是如果傳出從網絡直接解碼到位圖,現在想分享它作爲一個適當的形象,是啊,你真的需要該文件!

+2

我無法相信有沒有辦法做到這一點,將圖像保存到文件! – Charlires

+0

沒有保存到SD卡這是可能的, –

5

我能夠做到這一點:

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

這樣,我保存在我自己的緩存文件夾中的文件,所以我不與任何公共文件夾或愚弄取決於SD卡存在的。

此外,如果用戶刪除我的應用程序,它會自動刪除,但我也使用startActivityForResult/onActivityResult刪除該文件,並在完成共享時將其文件夾設回私人。

(我個人希望能找到一種方法來共享一個比特流,並完全避免創建文件的步驟,但我不認爲這是可能的。)

[編輯:我發現這並未」 t工作在2.3.6文件必須在文件上:/// mnt/sdcard。]

+0

你能夠與gmail共享圖像嗎?當我嘗試時,我收到了一些錯誤信息。 –

+0

As [this comment](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)對你的回答說:「在應用的內部存儲上創建世界可讀的文件不是一個好主意。」使用[FileProvider](http://stackoverflow.com/a/30172247/3681880)更安全地完成它。 – Suragch

+0

嗨,湯姆,你的回答很棒!你知道這個工作所需的最低API版本是什麼,即它能在Android 3.0+下工作嗎?謝謝。 – middlehut

16

與其他應用程序共享文件的推薦方法是使用名爲的FileProvider。這些文檔相當不錯,但有些部分有點棘手。這是一個總結。

搭建FileProvider在清單

<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> 

與您的應用程序包名稱替換com.example.myapp

創建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> 

這告訴FileProvider哪裏得到的文件共享(使用在這種情況下,緩存目錄)。

保存圖像到內部存儲

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

分享圖像

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

} 

進一步閱讀