当前位置: 首页 > 知识库问答 >
问题:

意图选择器,用于从图库或相机中选择图像,但在某些设备上不工作

匡旭东
2023-03-14

我创建了一个意图选择器,用于从图库或相机中选择任何图像。它在模拟器和其他设备上工作正常,但是当我使用redmi note 4测试它时,它显示“没有应用程序可以执行此操作”。

代码在这里-

   try {
        f = createImageFile();
        outputFileUri = Uri.fromFile(f);
        grantUriPermission("com.android.camera", outputFileUri,
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        List<Intent> allIntents = new ArrayList<>();
        if (outputFileUri != null) {
            Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            List<ResolveInfo> listCam = getPackageManager().queryIntentActivities(captureIntent, 0);
            for (ResolveInfo res : listCam) {
                Intent intent = new Intent(captureIntent);
                intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                intent.setPackage(res.activityInfo.packageName);
                if (outputFileUri != null)
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
                allIntents.add(intent);
            }
        }
        allIntents.addAll(getGalleryIntents(getPackageManager(), false));
        Intent target;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            target = new Intent();
        else {
            target = allIntents.get(allIntents.size() - 1);
            allIntents.remove(allIntents.size() - 1);
        }
        Intent chooserIntent = Intent.createChooser(target, "Select Source");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, allIntents.toArray(new Parcelable[allIntents.size()]));
        startActivityForResult(chooserIntent, REQ_PICK_IMAGE);
    } catch (IOException e) {
        e.printStackTrace();
        f = null;
        outputFileUri = null;
    }


  public static List<Intent> getGalleryIntents(@NonNull PackageManager packageManager, boolean includeDocuments) {
    List<Intent> intents = new ArrayList<>();
    Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
    galleryIntent.setType("image/*");
    List<ResolveInfo> listGallery = packageManager.queryIntentActivities(galleryIntent, 0);
    for (ResolveInfo res : listGallery) {
        Intent intent = new Intent(galleryIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(res.activityInfo.packageName);
        intents.add(intent);
    }
    if (!includeDocuments) {
        for (Intent intent : intents) {
            if (intent.getComponent().getClassName().equals("com.android.documentsui.DocumentsActivity")) {
                intents.remove(intent);
                break;
            }
        }
    }
    return intents;
}

private File createImageFile() throws IOException {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_";
    File albumF = getAlbumDir();
    File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, albumF);
    return imageF;
}

abstract class AlbumStorageDirFactory {
    public abstract File getAlbumStorageDir(String albumName);
}

public final class BaseAlbumDirFactory extends AlbumStorageDirFactory {
    // Standard storage location for digital camera files
    private static final String CAMERA_DIR = "/dcim/";

    @Override
    public File getAlbumStorageDir(String albumName) {
        return new File(Environment.getExternalStorageDirectory() + CAMERA_DIR + albumName);
    }
}

public final class FroyoAlbumDirFactory extends AlbumStorageDirFactory {
    @Override
    public File getAlbumStorageDir(String albumName) {
        return new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName);
    }
}

private File getAlbumDir() {
    File storageDir = null;
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
        storageDir = mAlbumStorageDirFactory.getAlbumStorageDir(getAlbumName());
        if (storageDir != null)
            if (!storageDir.mkdirs())
                if (!storageDir.exists()) {
                    Log.d("CameraSample", "failed to create directory");
                    return null;
                }
    } else Log.v(getString(R.string.app_name), "External storage is not mounted READ/WRITE.");
    return storageDir;
}

请帮帮我!我错过什么了吗?

共有1个答案

陆博易
2023-03-14

我遇到了同样的问题,但后来我意识到这是存储权限问题。我通过添加if条件来修改我的代码。

试试这个

image_layout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            isImageSelect =false;
            //checking if permission is granted for write_external_storage
            if(ActivityCompat.checkSelfPermission(NewMemberActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
                selectImage();
            }
            else{
                //Requesting Permission for write_external_storage
                ActivityCompat.requestPermissions(NewMemberActivity.this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            }
        }
    });
 类似资料:
  • 编辑:我调试了应用程序,并用初始化了。这消除了错误,但是现在ImageView没有得到更新,但是当我从Gallery中选择image时,它已经更新了。

  • 我必须做一个按钮,将提供从画廊或从相机选择图像。 结果是有效的。如果我从图库中选择,图像查看器将查看它,如果我选择从相机拍照,它也有效。问题是,在我的show FileChooser()方法中,我所有的意图都在同时运行,所以当我从图库中选择时,相机仍然运行。我选择相机,图库也在打开。我认为我应该在切换案例模式下实现我的代码,但我不明白如何做到这一点。请帮助解决我的初学者问题。

  • 有没有一个标准的方法来调用对话框选择从相机或从图库(如内置电话簿或Skype)的图像? 我看了一下这个,但是代码打开了图库,没有建议从相机中选择它。 设备:Samsung Galaxy Tab Android:2.3.3

  • 我试图从手机的画廊中选择一个图像,并将图像路径传递到另一个活动中,在那里它得到预览的用户。 我在另外两个设备上测试过这个(Moto E和一个叫酷派的东西?)他们似乎都工作得很好。 (调试Android源代码似乎不是一个可行的选择。) 在main活动中,在UI触发器上,我用以下代码启动了gallery picker: 我这样处理结果: 一旦获得存储在全局变量中的文件路径,就会调用以下方法: 现在我已

  • 我试图显示一个对话框,在那里按下图像按钮,然后从图库中选择图片或从相机中拍摄一些图片。我已经在努力选择一个图像并将其插入到正确的图像视图中。 现在,单击ImageButton(android:id=“@ id/imageSelect”)将显示对话框,然后选择从图库中选择,但它将图像插入(android:id=“@ id/imageSelect1),应该插入到(android:id=”@ id/im

  • 和onActivityResult 和错误的堆栈跟踪 stack_trace=java.lang.runtimeException:未能将结果ResultInfo{who=null,request=1,result=-1,data=intent{act=inline-data(havs extras)}}传递到活动{com.madhours/com.madhours.activities.acti