2016-06-28 52 views
2

這是我調用設備上的圖像編輯應用程序隱含的意圖:Android的隱含意圖編輯未能加載圖像

startActivity(new Intent(Intent.ACTION_EDIT).setDataAndType(myUri, 
    getMimeType(myUri)).setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | 
    Intent.FLAG_GRANT_WRITE_URI_PERMISSION)); 

而且我這是怎麼getMimeType:

public String getMimeType(Uri uri) { 
    String mimeType = null; 
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { 
     ContentResolver cr = getContentResolver(); 
     mimeType = cr.getType(uri); 
    } else { 
     String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri 
       .toString()); 
     mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
       fileExtension.toLowerCase()); 
    } 
    return mimeType; 
} 

對於某些應用它加載崩潰:

在應用程序Sketch_Camera只有一個隱形頁面加載並禁用與我的應用程序的交互。

在應用程序AirBrush它加載應用程序,但崩潰與此消息「無法加載圖像」。

是否與最小sdk版本有關,因爲我的版本是16? 我已經在9的最小sdk版本上測試過了,結果沒有變化。

還有什麼我應該添加到這個意圖與所有的應用程序?

我試過putExtra也是一樣,它並不能幫助:

.putExtra(Intent.ACTION_EDIT, myUri); 

我已經在我的設備上的一些畫廊的應用程序,他們都推出Sketch_CameraAirBrush沒有任何問題。

這裏發生了什麼?經過兩天與這種現象的鬥爭,我感到非常困惑。

+1

'myUri'的價值是什麼?你爲什麼使用'image/*'而不是實際的MIME類型(因爲它是*你的內容,所以你知道什麼是MIME類型)? – CommonsWare

+0

myUri是來自圖像文件>> Uri.fromFile(myFile)的一個uri,以及爲什麼我使用image/*而不是實際的MIME類型?我從堆棧中選擇了代碼。現在我已經根據你的指南編輯了這個問題。但我仍然得到相同的結果。 – Eftekhari

+1

「myUri是來自圖像文件的URI」 - 此文件在哪裏?在這種情況下,'Intent.FLAG_GRANT_READ_URI_PERMISSION'和'Intent.FLAG_GRANT_WRITE_URI_PERMISSION'是無用的,因爲它們不涉及'file''Uri'值。 「 – CommonsWare

回答

2

這是通過查詢MediaStore.Images.Media.EXTERNAL_CONTENT_URI

誰也不能保證,其他的應用程序有權利到這個位置,甚至可以說從一個媒體庫文件的路徑創建的文件您的應用擁有此位置的權利。例如,圖像可能在removable storage。此外,無論如何,the fileUri scheme is being banned for cross-app usage

改爲使用contentUri。例如,在this sample app中,我查詢了MediaStore的視頻。鑑於一個Cursor名爲row定位在特定的視頻,我通過生成Uri吧:

videoUri= 
    ContentUris.withAppendedId(
     MediaStore.Video.Media.EXTERNAL_CONTENT_URI, row.getInt(row.getColumnIndex(MediaStore.Video.Media._ID))); 

Uri兩部作品爲我自己的目的(如手,畢加索獲得的縮略圖,手VideoView播放)和交給第三方應用程序(例如,用於播放的ACTION_VIEW)。

除了將基準Uri更改爲您查詢的基準(MediaStore.Images.Media.EXTERNAL_CONTENT_URI)之外,相同的基本代碼應該適合您。

另外,擺脫你的Intent旗幟。這些僅適用於Intent指向您自己的ContentProvider的位置,在您的原始代碼或您從withAppendedId()創建的Uri中都不是這種情況。