【问题标题】:resultCode from Camera is always 0来自相机的 resultCode 始终为 0
【发布时间】:2017-07-16 14:38:26
【问题描述】:

resultCode 从相机总是为 0。

摄像头调用代码:-

Intent imageIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                fileUri = getOutputMediaFileUri(Constants.ATTACH_IMAGE);
                imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
                imageIntent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());

                if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {

                    if (imageIntent.resolveActivity(getContext().getPackageManager()) != null) {
                        startActivityForResult(imageIntent, 1);
                    }
                    imageIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                }
                else {
                    List<ResolveInfo> resInfoList = getContext().getPackageManager().queryIntentActivities(imageIntent, PackageManager.MATCH_DEFAULT_ONLY);
                    for (ResolveInfo resolveInfo : resInfoList) {
                        String packageName = resolveInfo.activityInfo.packageName;
                        getContext().grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    }

                    startActivityForResult(imageIntent, Constants.ATTACH_IMAGE);

                }

fileUri 看起来像:- content://com.dummyname1.dummname2.provider/external_files/DummyName/IMG_SR7896f7f4-8eb7-47bc-990c-d46ad04c2a7c.jpeg

OnActivityResult :-

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case Constants.ATTACH_IMAGE:

                if(resultCode ==Constants.RESULT_OK){
                    attachmentType="IMAGE";
                    attachment.setEnabled(false);
                    attachLayout.setVisibility(View.GONE);
                    Toast.makeText(getActivity().getApplicationContext(), R.string.successfull_image, Toast.LENGTH_SHORT).show();
                    File actualImage = null;
                    try {
                        actualImage = FileUtil.from(getContext(),fileUri);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if(actualImage!=null){

                        File compressedImage = new Compressor.Builder(getContext())
                                .setMaxWidth(1920).setMaxHeight(1440)
                                .setQuality(75)
                                .setCompressFormat(Bitmap.CompressFormat.JPEG)
                                .setDestinationDirectoryPath(Constants.SavePath).build().compressToFile(actualImage);

                    }
                    add_Comments_on_Media_add("Photo added!");

                }
                else
                    mediaName="";
                break;

【问题讨论】:

  • 也许您正在测试的特定相机应用程序不支持content 方案EXTRA_OUTPUT
  • “我可以做些什么来使这项工作适用于所有设备?” - 摆脱所有这些代码。 ACTION_IMAGE_CAPTURE 本质上是不可靠的,因为您无法控制第三方应用程序的行为。要么使用相机库,要么直接使用 Android 相机 API(android.hardware.Cameraandroid.hardware.camera2.*)。
  • 我不知道你在寻找什么样的“代码 sn-p”。使用任一本机相机 API 都远远超出了“代码 sn-p”的范围。体面的camera libraries 将代码 sn-ps 作为其网站的一部分。
  • 因为它是 Android SDK 本身中唯一简单的相机选项。 “简单”并不意味着“可靠”。对于您不是绝对需要拍照的情况,您可以告诉用户“对不起,您的相机应用程序似乎无法正常工作,请尝试另一个”,ACTION_IMAGE_CAPTURE 可以。但是您问“我该怎么做才能使这项工作适用于所有设备?”,因此ACTION_IMAGE_CAPTURE 是不合适的。
  • 在数千种 Android 设备型号上预装了 数百种 种不同的相机应用,还有更多可供用户自行安装。大多数相机应用程序都是从头开始编写的。没有兼容性测试,甚至谷歌自己的相机应用直到一年前才支持content方案。

标签: android android-intent android-camera-intent


【解决方案1】:

您使用 2 个函数:startActivityForResult() 和 2 个请求代码,1 用于 API 级别 >= 21,Constants.ATTACH_IMAGE 用于 API 级别

但问题是你只处理case Constants.ATTACH_IMAGE:

试试这个:case Constants.ATTACH_IMAGE: case 1:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多