我创建了一个选择器,用于从文件中拾取图像或制作图片.
我使用的代码在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[] {}));
这将手动将每个匹配的意图直接添加到您的选择器