今天看到crash列表里出現了
ActivityNotFoundException
,信息就是標題上的那些,定位之后發現是從相冊選擇圖片處隱式啟動相冊找不到Activity,可能是用戶的設備上沒有相冊應用(黑人問號)。之前的處理方式是這樣
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};
// 獲取選擇照片的數據視圖
Cursor cursor = getContentResolver()
.query(selectedImage,filePathColumn, null, null, null);
cursor.moveToFirst();
// 從數據視圖中獲取已選擇圖片的路徑
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、打開內容管理器,也就是“文檔”,設置查找的type為image,這玩意一般設備都有的,不過還是判斷一下吧,現在看到隱式啟動心里都虛的,你根本不知道你的用戶是什么奇奇怪怪的設備。
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