手機適配-魅族手機透過Intent開啟檔案Bug解決方案

local0發表於2021-09-09

下面是開啟檔案的Intent的程式碼片段:

public static Intent makeOpenFileIntent(Context context, String mime, File path) {
    Intent intent = new Intent(Intent.ACTION_VIEW);

    LogUtils.v(TAG, "Open file with mime: " + mime);    if (StringUtils.isNullOrEmpty(mime)) {
        intent.setDataAndType(Uri.fromFile(path), "*/*");
    } else {
        intent.setDataAndType(Uri.fromFile(path), mime);
    }    return intent;
}

透過Intent請求系統篩選出能開啟目標檔案的Activity,基本都是透過上面這段程式碼來實現的,沒毛病。
使用魅族手機debug後發現,出問題的都是那些 mime 為null的檔案。mime這個引數,即檔案的 MimeType。透過下面的程式碼來獲取:

MimeTypeMap.getSingleton().getMimeTypeFromExtension(String extension);

由此基本可以得出結論,魅族手機發現你傳遞過來的檔案的 MimeType為 /時,並不會彈出所有支援 Intent.ACTION_VIEW的Activity供你選擇,而是直接跳轉到某個系統自帶的應用了。

Context#start...(Intent) 系列方法的工作原理:如果使用的是顯式Intent,就直接去啟動具體的元件;如果使用的是隱式Intent,那麼系統先經過篩選找到所有符合Intent描述資訊的元件,然後顯示符合條件的元件列表供你選擇。其實,隱式Intent最終還是被轉換成了顯示Intent。

實現Activity選擇器

經過上面分析,我們就可以開始實現自定義Activity選擇器了,這個專案的名稱就叫做AppChooser。
先來看一下效果:

引入專案

compile 'io.julian:appchooser:1.0.4'

使用方法,在Activity或Fragment中:

@NonNullprivate AppChooser mAppChooser;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file_infos);      // 初始化 AppChooser
    mAppChooser = AppChooser.with(this); 
}@Overridepublic void onStart() {    super.onStart();      // 繫結 AppChooser
    mAppChooser.bind();
}@Overridepublic void onStop() {    super.onStop();       // 解綁 AppChooser
    mAppChooser.unbind();
}/**
* 開啟檔案
*/private void showFile(FileInfo file) {      // 傳入File物件
      mAppChooser.file(new File(file.getAbsolutePath())).load();
}

原文連結:http://www.apkbus.com/blog-924779-76715.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/132/viewspace-2812875/,如需轉載,請註明出處,否則將追究法律責任。

相關文章