1. 程式人生 > >android 應用元件[通用 Intent---開啟特定型別的檔案] 十二

android 應用元件[通用 Intent---開啟特定型別的檔案] 十二

在 Android 4.4 或更高版本上執行時,您可以不必檢索必須匯入應用的檔案副本(使用  操作),而是使用  操作並指定 MIME 型別,請求開啟由另一個應用管理的檔案。如果還需要允許使用者建立應用可寫入的新文件,可改用  操作。例如, Intent 允許使用者選擇他們想在哪裡建立新 PDF 文件(在另一個管理文件儲存的應用內),而不是從現有文件中進行選擇 — 您的應用隨後會收到其可以寫入新文件的 URI 位置。

返回的 URI 會為您的應用授予對檔案的長期讀取許可權(還可能會授予寫入許可權)。 因此,如果您想讀取現有檔案而不將其副本匯入您的應用,或者您想就地開啟和編輯檔案,特別適合使用操作(而不是使用 )。

您還可以通過為 Intent 新增  並將其設定為 true,允許使用者選擇多個檔案。如果使用者只選擇一項,您就可以從  檢索該專案。如果使用者選擇多項,則  返回 null,此時您必須改為從  返回的  物件檢索每個專案。

:您的 Intent 必須指定 MIME 型別,並且必須宣告  類別。必要時,您可以使用  extra 新增一個 MIME 型別陣列來指定多個 MIME 型別 — 如果您這樣做,必須將  中的主 MIME 型別設定為 "*/*"

用於獲取照片的示例 Intent

static final int REQUEST_IMAGE_OPEN = 1;

public void selectImage() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.setType("image/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test.
    startActivityForResult(intent, REQUEST_IMAGE_OPEN);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) {
        Uri fullPhotoUri = data.getData();
        // Do work with full size photo saved at fullPhotoUri
        ...
    }
}

第三方應用實際上無法通過  操作響應 Intent,而是由系統接收此 Intent,然後在統一使用者介面中顯示各類應用提供的所有檔案。

如需在該 UI 中提供您的應用的檔案,並允許其他應用開啟它們,您必須實現一個 ,並加入一個  Intent 過濾器 ("android.content.action.DOCUMENTS_PROVIDER")。例如:

<provider ...
    android:grantUriPermissions="true"
    android:exported="true"
    android:permission="android.permission.MANAGE_DOCUMENTS">
    <intent-filter>
        <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
    </intent-filter>
</provider>

如需瞭解有關如何實現從其他應用開啟您的應用管理的檔案的詳細資訊,請閱讀儲存訪問框架指南。