【问题标题】:an android file picker or camera for taking pictures or videos not working on nexus 4用于拍摄照片或视频的 android 文件选择器或相机在 nexus 4 上不起作用
【发布时间】:2015-09-21 15:16:50
【问题描述】:

我正在尝试使用以下代码打开一个 android 文件选择器或相机来拍摄照片或视频:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PICKFILE_RESULT_CODE && Activity.RESULT_OK == resultCode) {
            try {
                // Get the Uri of the selected file 
                Uri uri = data.getData();
                LogS.d("File Uri: " + uri.toString());
                // Get the path
                String path = BeanUtils.getPath(getActivity().getApplicationContext(), uri);

                AnnexFile f = new AnnexFile(path);
                if (!addedFiles.contains(f)) {
                    addFileToLayout(f);
                    addedFiles.add(f);
                } else {
                    Toast.makeText(getActivity(), R.string.you_allready_added_this_file_, Toast.LENGTH_SHORT).show();;
                }
            } catch (Exception e) {
                LogS.e(e);
                Toast.makeText(getActivity(), getString(R.string.file_manager_invalid), Toast.LENGTH_LONG).show();
            }
        } else if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && Activity.RESULT_OK == resultCode) {
            try {
                Uri uri = data.getData();
                LogS.d("File Uri: " + uri.toString());
                // Get the path
                String path = BeanUtils.getPath(getActivity().getApplicationContext(), uri);

                AnnexFile f = new AnnexFile(path);
                if (!addedFiles.contains(f)) {
                    addFileToLayout(f);
                    addedFiles.add(f);
                } else {
                    Toast.makeText(getActivity(), R.string.you_allready_added_this_file_, Toast.LENGTH_SHORT).show();;
                }
            } catch (Exception e) {
                LogS.e(e);
                Toast.makeText(getActivity(), getString(R.string.file_manager_invalid), Toast.LENGTH_LONG).show();
            }
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    private void openImageIntent() {

    // Camera.
    final List<Intent> cameraIntents = new ArrayList<Intent>();
    final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    final PackageManager packageManager = getActivity().getPackageManager();
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
    for (ResolveInfo res : listCam){
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(captureIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(packageName);
        cameraIntents.add(intent);
    }

    final Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    final List<ResolveInfo> listVideoCam = packageManager.queryIntentActivities(videoIntent, 0);
    for (ResolveInfo res : listVideoCam){
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(videoIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(packageName);
        cameraIntents.add(intent);
    }

    //FileSystem
    final Intent galleryIntent = new Intent();
    galleryIntent.setType("image/*;video/*");
    galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

    // Chooser of filesystem options.
    final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
    // Add the camera options.
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
    startActivityForResult(chooserIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);

}

该代码在 Samsung S4 和 Sony Experia J 上运行良好,但在 Nexus 4 (android 5.1.1) 上失败。当我在 nexus 4 上调试应用程序时,我发现如果最终用户尝试制作图片,则以下 Uri uri = data.getData(); 为空。如果用户尝试制作视频或打开现有媒体文件,该应用程序可在所有设备上运行。

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

    当我在 nexus 4 上调试应用程序时,我发现以下 Uri uri = data.getData();如果最终用户尝试制作图片,则为 null

    您假设ACTION_IMAGE_CAPTUREUri 的形式返回结果。它是not documented to do so。有数以千计的相机应用程序,预装和用户安装。他们中的许多人会宣传对ACTION_IMAGE_CAPTURE 的支持。没有人必须返回 Uri 结果。

    【讨论】:

    • 感谢您的回答。我通过在两种方法中使用 imageFile 字段解决了这个问题:intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));Uri uri = data.getData(); String path; if (uri == null) { path = imageFile.getPath(); LogS.d("path: " + path); } else { LogS.d("File Uri: " + uri.toString()); // Get the path path = BeanUtils.getPath(getActivity().getApplicationContext(), uri); }
    • 但是我现在有另一个问题。如何确定哪个文件来自 android 文件选择器,哪个文件来自相机?
    • @aurelianr:看看你在onActivityResult()中得到的resultCode
    • @aurelianr:然后在您的startActivityForResult() 调用中使用不同的结果代码。毕竟,上面显示的onActivityResult() 实现具有PICKFILE_RESULT_CODE 的代码。
    • @aurelianr:“我对所有类型的意图都有一个 startActivityforResult”——那么你将不得不改变它,或者你将不得不改变你的期望,这样你就不会关心图像的来源。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2017-04-09
    相关资源
    最近更新 更多