如何打開相冊選擇圖片與出現(xiàn)的問題No Activity found to handle Intent { act=android.intent.action.PICK dat=content://media/external/images/media }

  • 今天看到crash列表里出現(xiàn)了ActivityNotFoundException,信息就是標(biāo)題上的那些,定位之后發(fā)現(xiàn)是從相冊選擇圖片處隱式啟動相冊找不到Activity,可能是用戶的設(shè)備上沒有相冊應(yīng)用(黑人問號)。

  • 之前的處理方式是這樣

Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, RC_ALBUM);

onActivityResult里面是這樣

else if (requestCode == RC_ALBUM && resultCode == RESULT_OK && data != null) {
            Uri selectedImage = data.getData();
            if (selectedImage != null) {
                String[] filePathColumn = {MediaStore.Images.Media.DATA};
                // 獲取選擇照片的數(shù)據(jù)視圖
                Cursor cursor = getContentResolver()
                .query(selectedImage,filePathColumn, null, null, null);
                cursor.moveToFirst();
                // 從數(shù)據(jù)視圖中獲取已選擇圖片的路徑
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String picturePath = cursor.getString(columnIndex);
                cursor.close();
                // 將圖片顯示到界面上
                Bitmap bm = BitmapFactory.decodeFile(picturePath);

                findViewById(R.id.rl_table).setBackground(new BitmapDrawable(bm));
            }
  • 解決辦法有三種,自行選擇:
    1、簡單粗暴的方法就是判斷下隱式intent有沒有匹配的Activity,有再去啟動,沒有就給他Toast什么的吧
Intent intent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(intent
            ,PackageManager.MATCH_DEFAULT_ONLY);
if(resolveInfos.size()!=0){
    startActivityForResult(intent, RC_ALBUM);
}else {
      ...
}

2、打開內(nèi)容管理器,也就是“文檔”,設(shè)置查找的type為image,這玩意一般設(shè)備都有的,不過還是判斷一下吧,現(xiàn)在看到隱式啟動心里都虛的,你根本不知道你的用戶是什么奇奇怪怪的設(shè)備。

Intent intent = new Intent();
 intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), RC_ALBUM);
List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(intent
            ,PackageManager.MATCH_DEFAULT_ONLY);
if(resolveInfos.size()!=0){
    startActivityForResult(intent, RC_ALBUM);
}else {
      ...
}

3、讓用戶選擇用文檔還是相冊來打開


Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
getIntent.setType("image/*");
Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});
 startActivityForResult(chooserIntent, RC_ALBUM);
  • 最后需要注意的是如果使用ACTION_GET_CONTENT方式打開的話,在onActivityResult中獲取文件的方式和用 ACTION_PICK是不一樣的,而且在安卓4.4之前和之后也是不一樣的,請注意。
    有個臺灣友人做了個工具類,可以看看他的blog

EOF

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容