【问题标题】:Camera picture returning null url. (Android)相机图片返回空 url。 (安卓)
【发布时间】:2014-03-13 07:12:27
【问题描述】:

每次我用相机拍照时,都会将 selectedImageUri 设置为 null...

另外,DATA IS NOT NULL 和 ACTION IS NOT NULL 被调用,因为我的困惑......我不确定我是否做错了什么让我知道,拍照时 selectedImageUri 应该返回为 Uri 和不为空

这是我的代码:

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == getActivity().RESULT_OK) {
            if (requestCode == YOUR_SELECT_PICTURE_REQUEST_CODE) {
                final boolean isCamera;
                if (data == null) {
                    Log.e("data", "DATA IS NULL");
                    isCamera = true;
                } else {
                    Log.e("data", "DATA IS NOT NULL");
                    final String action = data.getAction();
                    //Log.e("PICTURE PATH?", action);
                    if (action == null) {
                        Log.e("data", "ACTION IS NULL");
                        isCamera = false;
                    } else {
                        Log.e("data", "ACTION IS NOT NULL");
                        isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

                    }
                }

                Uri selectedImageUri;
                if (isCamera) {
                    selectedImageUri = outputFileUri;
                    String uploadurl = "discover/p";
                    File photoSelected = new File(selectedImageUri.getPath());
                    TypedFile photo = new TypedFile("application/octet-stream", photoSelected);
                    String userId = "userId1";
                    Callback cameraResponse = new Callback() {
                        @Override
                        public void success(Object o, Response response) {

                        }

                        @Override
                        public void failure(RetrofitError retrofitError) {
                            Log.e("TAG", retrofitError.getMessage());
                        }
                    };
                    uploadImage(uploadurl, photo, userId, cameraResponse);
                    Picasso.with(getActivity()).load(selectedImageUri.getPath()).into(profilePicture);
                } else {
                    if (data == null) {
                        selectedImageUri = null;
                    } else {
                        selectedImageUri = data.getData();
                        Log.e("gallery image", "link is " + data.getData());
                        String uploadurl = "discover/p";
                        File photoSelected = new File(String.valueOf(selectedImageUri));
                        TypedFile photo = new TypedFile("application/octet-stream", photoSelected);
                        String userId = "userId1";
                        Callback galleryResponse = new Callback() {
                            @Override
                            public void success(Object o, Response response) {

                            }

                            @Override
                            public void failure(RetrofitError retrofitError) {

                            }
                        };
                        uploadImage(uploadurl, photo, userId, galleryResponse);

                        Picasso.with(getActivity()).load(selectedImageUri).into(profilePicture);
                    }

                }
            }
        }
    }

编辑包括相机代码:

if(isDeviceSupportCamera()) {
                // Determine Uri of camera image to save.
                final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator);
                root.mkdirs();
                final String fname = getUniqueImageFilename();
                final File sdImageMainDirectory = new File(root, fname);
                outputFileUri = Uri.fromFile(sdImageMainDirectory);
                Log.e("is camera ", "even getting CALLED CAM1111?");
                // Camera.
                final List<Intent> cameraIntents = new ArrayList<Intent>();
                Log.e("is camera ", "even getting CALLED CAM?222");
                final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                final PackageManager packageManager = getActivity().getPackageManager();
                final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
                Log.e("is camera ", "even getting CALLED CAM333?");
                for (ResolveInfo res : listCam) {
                    Log.e("is camera ", "even getting CALLED CAM4444?");
                    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);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
                    cameraIntents.add(intent);
                }
                Log.e("is camera ", "even getting CALLED CAM?5555");

                final Intent chooserCameraIntent = Intent.createChooser(captureIntent, "Use Camera");

                startActivityForResult(chooserCameraIntent, YOUR_SELECT_PICTURE_REQUEST_CODE);

                } else {
                     Toast.makeText(getActivity(), "There is no camera available on this device.", Toast.LENGTH_SHORT).show();
                }

            }

更新

日志文件:

03-12 10:20:21.854  27814-27814/com.example.app E/data﹕ CAMERA IS NOT NULL outputfileuri is file:///storage/emulated/0/MyDir/img_userID1%20_1394612413661.jpg
03-12 10:20:21.854  27814-27814/com.example.app E/data﹕ camera link for selectedImageUri file:///storage/emulated/0/MyDir/img_userID1%20_1394612413661.jpg
03-12 10:20:21.854  27814-27814/com.example.app E/data﹕ selected image get path link is /storage/emulated/0/MyDir/img_userID1 _1394612413661.jpg

我还为 isCamera 添加了 true 而不是

action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

如果我在我的 if 请求代码下添加此代码

 if (resultCode == getActivity().RESULT_OK) {
            if (requestCode == YOUR_SELECT_PICTURE_REQUEST_CODE) {
//                Bundle extras = data.getExtras();
//                Bitmap imageBitmap = (Bitmap) extras.get("data");
//                profilePicture.setImageBitmap(imageBitmap);
               final boolean isCamera;

它实际上在图像视图中显示图像......所以我很困惑为什么它没有正确获取 uri。

这是 android manifest 权限

<!-- For Camera use and downloading image -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!-- internet -->
    <uses-permission android:name="android.permission.INTERNET" />

【问题讨论】:

  • 最佳猜测:outputFileUri 在用于设置 selectedImageUri 之前为空。由于您尚未发布有关 outputFileUri 的相关代码,因此没有足够的信息可以帮助您。
  • 嘿,通过包含相机代码更新了帖子,在此之前它被初始化为私有 Uri outputFilUri
  • 您确定它的值正确吗?您是否包含了所需的权限?
  • E/JHEAD﹕无法打开 '/storage/emulated 我收到该错误,这是我将其添加到底部的错误。因为我稍微编辑了我的代码
  • 当您使用 Log.e 记录您的消息时,它们在日志中显示为错误。您实际上应该使用 Log.d 或 Log.i。您还应该将要添加的权限发布到清单 (AndroidManifest.xml) 您可能忘记向外部文件添加权限。

标签: android android-camera


【解决方案1】:

您的 Activity 可能已被系统销毁,以便为相机应用释放内存以处理您的意图。您可以使用onSaveInstanceState() 保存和状态并在onCreate() 中恢复它。参见例如Android startCamera gives me null Intent and ... does it destroy my global variable?.

【讨论】:

  • 嘿,我实际上将我的代码更改为 stackoverflow.com/questions/22365783/… 并调用 onActivity 创建,我尝试了您的建议,即在 Activity 结果后翻转它以使用 onCreate 但它给了我相同的结果...我也使用了fileurl ...我会标记你是正确的,因为这是我应该做的事情,但你能帮我解决另一个问题吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多