2016-02-12 62 views
1

我正在開發一個填充電子郵件模板並添加圖片的應用程序。我想按如下方式使用該應用程序:從圖庫中,我通過ACTION_SEND與我的應用程序共享圖像。我的應用做了一些處理,然後與附件共享一封電子郵件。轉發圖像URI意圖

現在我試圖簡單地得到圖像Uri並將其傳遞,但​​後來我得到一個SecurityException。

protected void onCreate(Bundle savedInstanceState) { 
    // Read the incoming intent 
    Intent intent = getIntent(); 
    String action = intent.getAction(); 
    String type = intent.getType(); 
    Uri imageUri; 

    if (Intent.ACTION_SEND.equals(action) && type != null) { 
     if (type.startsWith("image/")) { 
      imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); 
     } 
    } 

    // Create the outgoing intent 
    Intent emailIntent = new Intent(Intent.ACTION_SEND); 
    emailIntent.setType("message/rfc822"); 
    if(imageUri != null){ 
     emailIntent.putExtra(Intent.EXTRA_STREAM, imageUri); 
    } 

    startActivity(Intent.createChooser(emailIntent, getString(R.string.chooserText))); 
} 

記錄:

02-12 14:07:11.196 10241-10241/? E/ResolverActivity: Unable to launch as uid 10156 package ***, while running in android:ui 
java.lang.SecurityException: Uid 10156 does not have permission to uri 0 @ content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F19546/FORMAT_JPEG/778368258 

什麼是做到這一點的正確方法?我曾嘗試設置標誌和權限,但我找不到如何完全做到這一點。

+0

你是如何添加這些標誌和權限的?您正在開發哪個API版本(分鐘和目標)? – kazbeel

回答

1

從圖像庫中,我與我的應用程序

你沒有解釋這是什麼意思分享圖片。我認爲這意味着您已在應用中添加了ACTION_SEND活動,並且您正在圖像庫應用中使用一些「分享」選項將圖像發送到您的應用。

什麼是正確的方法來做到這一點?

在某種程度上,沒有正確的方法來做到這一點。您的選項是:

  1. 將映像複製到您的應用程序(例如,轉換爲內部存儲),然後共享本地副本(例如,通過FileProvider

  2. 不要使用ACTION_SEND接收圖像。相反,使用MediaStore來查找圖像並用這些圖像呈現您自己的UI。然後,通過ACTION_SEND發送所選圖像的Uri。這可能有效,但我不像其他兩種選擇那樣自信。

  3. 不要使用ACTION_SEND發送電子郵件,而是使用JavaMail或某些等效庫(需要用戶給你很多的過甜的東西,如電子郵件密碼),或使用你的Web服務器發送它(需要你將圖像上傳到您的服務器)。

  4. 不要編寫這個應用程序,因爲用戶可以通過電子郵件自己發送圖像,從他們用來觸發您的應用程序的「圖像庫」應用程序中的相同「共享」菜單中發送圖像。

的問題是,你這裏有三個應用程序:A,B,和C:

  • A的圖像庫

  • B是你的應用程序

  • C是您試圖通過電子郵件客戶端ACTION_SEND

當A使用ACTION_SEND來調用B時,A授予B處理圖像的權限。然而,B沒有能力轉身並賦予C權利來處理A的形象。

0

從API 16開始,只需將FLAG_GRANT_READ_URI_PERMISSION添加到共享意圖即可。這將授予接收應用程序讀取content:// URI的權限。它也可以傳遞,即授予您的應用程序的權限,您可以將其授予接收應用程序。

emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

在之前的API 16個版本,因爲content:// URI存儲在EXTRA_STREAM和URI權限僅適用於與setData(Uri)設置的URI這是不行的。要解決該限制,您可以添加以下行。

emailIntent.setData(imageUri); 

附註:使用「message/rfc822」不會將選擇器列表限制爲電子郵件應用程序。我知道沒有電子郵件客戶端具有特意匹配「message/rfc822」的意圖過濾器。它僅適用於大多數電子郵件客戶端支持附加任意文件,即「*/*」。但是,例如文件管理器,所以他們也出現在該列表中。您不妨使用圖像的正確MIME類型。