Android相机在官方固件和股票roms上有不同的行为

时间:2013-09-20 08:54:34

标签: android android-camera

在我的应用程序中,我使用以下代码访问摄像头:

camIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(camIntent, 0);

在我的onActivityForResult中:

AQuery aq = new AQuery(this);
Uri selectedImage = data.getData();
ivSecondPic.setVisibility(View.VISIBLE);
strMainPic = getRealPathFromURI(selectedImage);
File f = new File(strMainPic);

这是我收到错误的地方:

public String getRealPathFromURI(Uri contentUri) {
        String res = null;
        String[] proj = { MediaStore.Images.Media.DATA };
        //This line (cursor)
        Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        if(cursor.moveToFirst()){;
           int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
           res = cursor.getString(column_index);
        }
        cursor.close();
        return res;
    }

无论如何,这适用于官方软件。问题是当我尝试在安装了库存rom的设备上使用相机时,我得到NullPointerException。有谁知道如何解决这个问题?提前谢谢。

编辑我发现selectedImagenull。如何获得图像uri?有什么明显的东西让我失踪吗?显然data.getData()没有返回任何内容。那么如何获得Uri

1 个答案:

答案 0 :(得分:0)

是的,这实际上是一个问题。您可以尝试创建一个文件,在实际使用相机拍摄之前放置图像。类似的东西:

                filename = System.currentTimeMillis()  + ".jpg";
                filepath = Environment.getExternalStorageDirectory() + "/DIR/";
                photoFile = new File(filepath+filename);
                photoUri = Uri.fromFile(photoFile);

                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE );
                intent.putExtra( MediaStore.EXTRA_OUTPUT, photoUri);
                startActivityForResult(intent, R.id.take_photo);

然后在onActivityResult:

            Uri selectedImageUri = null;
            String uriString = null;
            try{
                selectedImageUri = data.getData();
            }catch(Exception e){ }

            if(selectedImageUri == null){
                selectedImageUri = takePhotoUri;
                // if nothing came back insert image manually
                uriString = Media.insertImage(getContentResolver(), filepath+filename, filename, null);
            }