我创建了一个选择器,用于从文件中拾取图像或制作图片.
我使用的代码在Nexus 5上工作正常,但是当我在三星S5上试用时,选择器不会显示相机图标.
public Intent makePhotoIntent(String title,Context ctx,String uniqueImageId){ //Build galleryIntent Intent galleryIntent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); galleryIntent.setType("image/*"); //Create chooser Intent chooser = Intent.createChooser(galleryIntent,title); if (checkexCameraHardware()){ Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); mTempImage = null; try { mTempImage = createImageFile(uniqueImageId); } catch (IOException e) { e.printStackTrace(); } if (mTempImage != null){ cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,Uri.fromFile(mTempImage)); //add file ure (photo is saved here) Intent[] extraIntents = {cameraIntent}; chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS,extraIntents); } } return chooser; }
当我更改意图添加到选择器的顺序时,三星设备会显示相机,但只显示android-system作为文件选项.
public Intent makePhotoIntent(String title,Uri.fromFile(mTempImage)); //add file ure (photo is saved here) //I have to re-create the chooser here or the Samsung will not show the 'camera' icons. //I have to add the cameraIntent first. chooser = Intent.createChooser(cameraIntent,title); Intent[] extraIntents = {galleryIntent}; //Intent[] extraIntents = {cameraIntent}; chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS,extraIntents); } } return chooser; }
解决方法
>如果有额外意图的多个意图匹配(Intent.EXTRA_INITIAL_INTENTS),它将在“Android系统”下显示所有这些意图匹配.当您点击“Android系统”时,它将打开另一个具有所有这些意图匹配的选择器.
>所以,在你的三星设备的第一个截图中,相机确实出现了 – 它正好在“Android Systeem”下(点击这将显示所有相机意图匹配).
>如果你使galleryIntent额外而不是相机意图,它将结合“Android Systeem”下的所有画廊相关意图(如你在samsung设备的第二个截图中所见)
>所以,在你的三星设备的第一个截图中,相机确实出现了 – 它正好在“Android Systeem”下(点击这将显示所有相机意图匹配).
>如果你使galleryIntent额外而不是相机意图,它将结合“Android Systeem”下的所有画廊相关意图(如你在samsung设备的第二个截图中所见)
如果他不知道这个“Android Systeem”是什么,我想用户可能会感到困惑!
在您的第二个代码段中,替换
Intent[] extraIntents = {galleryIntent}; chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS,extraIntents);
用:
List<Intent> galleryIntents = new ArrayList<Intent>(); PackageManager pm = getApplicationContext().getPackageManager(); for (ResolveInfo ri: pm.queryIntentActivities(galleryIntent,PackageManager.MATCH_DEFAULT_ONLY)) { Intent intent = pm.getLaunchIntentForPackage(ri.activityInfo.packageName); intent.setAction(Intent.ACTION_PICK); galleryIntents.add(intent); } chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS,galleryIntents.toArray(new Parcelable[] {}));
这将手动将每个匹配的意图直接添加到您的选择器