新活动中的Android显示相机图像

时间:2012-01-03 14:38:58

标签: android

到目前为止,我让我的应用程序拍照,在SD卡上创建一个新文件夹,并将图片保存到新文件夹中。

我试图这样做,所以一旦拍完照片,它会显示在一个新的活动中,有两个按钮,表示“使用”或“重拍”。到目前为止,图像保存工作得很好但是一旦图像被拍完并且它试图打开新的活动它就会停留在相机活动上并显示我无法使用的图像,因为它有一个surfaceView onit。

在我的LogCat中,我收到错误“哦,没有参考”,设置为显示它是否找不到图片,这就是为什么我认为这可能是因为我没有从正确的地方调用图片我的Punch.java。

所以基本上我试图让一个图像被应用程序打开一个新的活动“Punch.java”并显示刚刚拍摄的图像。

更新感谢Lumis(以下代码已更新)

已更改

intent.putExtra("filepath",uriSavedImage);

intent.putExtra("filepath",uriSavedImage.toString());

现在打开新的活动但仍看不到图像。

更新2 Punch.java

如果我将(myRef)更改为"/sdcard/Punch/image_0.jpg",我已将新的代码更新为Punch.java我可以看到该图片,但我需要它来重新拍摄刚用相机拍摄的图像这与我认为intent.putExtra("filepath",uriSavedImage.toString());

这一行有关

更新3

现在使用intent.putExtra("filepath",Uri.parse(output.getAbsolutePath()).toString());几乎完美地工作但由于某种原因它仍然在mnt/sdcard开始时只需要sdcard/

好的,现在工作正常/ mnt / sdcard是在拍摄照片时将SD卡安装到电脑上。

在我的相机活动中我有

PictureCallback myPictureCallback_JPG = new PictureCallback(){

    public void onPictureTaken(byte[] arg0, Camera arg1) {
        // TODO Auto-generated method stub
        /*Bitmap bitmapPicture 
            = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);  */
        int imageNum = 0;
        Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Punch");
        imagesFolder.mkdirs(); // <----
        String fileName = "image_" + String.valueOf(imageNum) + ".jpg";
        File output = new File(imagesFolder, fileName);
        while (output.exists()){
            imageNum++;
            fileName = "image_" + String.valueOf(imageNum) + ".jpg";
            output = new File(imagesFolder, fileName);
        }

        Uri uriSavedImage = Uri.fromFile(output);
        imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);


        OutputStream imageFileOS;
        try {
            imageFileOS = getContentResolver().openOutputStream(uriSavedImage);
            imageFileOS.write(arg0);
            imageFileOS.flush();
            imageFileOS.close();

            Toast.makeText(AndroidCamera.this, 
                    "Image saved", 
                    Toast.LENGTH_LONG).show();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Intent intent = new Intent(getBaseContext(), Punch.class);
        intent.putExtra("filepath",uriSavedImage.toString());
        //just using a request code of zero
        int request=0;
        startActivityForResult(intent,request); 
    }};

我的下一个活动Punch.java是:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.punch);

    String myRef = this.getIntent().getStringExtra("filepath");

    File imgFile = new  File(myRef);
    if(imgFile.exists()){

        Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

        ImageView myImage = (ImageView) findViewById(R.id.imagepunch);
        myImage.setImageBitmap(myBitmap);

    }

}

}

2 个答案:

答案 0 :(得分:1)

我认为这是文件路径问题。您将文件路径作为URI提交,但是您在查看器活动中将其作为字符串读取。

也许您需要将此行更改为:

intent.putExtra("filepath",uriSavedImage.toString());

或者

intent.putExtra("filepath",Uri.parse(output.getAbsolutePath()).toString()); 

当涉及到文件路径时,不同版本的android可能无法正常工作,因此您需要使用Uri.parse(fileStr)或String ...

进行实验

答案 1 :(得分:0)

只要查看您的代码和方法,我认为您在这种情况下通常会看到的是新注册的内容处理程序,以便它显示在相机/图像库的“共享”选项下。这样,您就不会参与使用/重拍逻辑,这对于内置的Android功能来说基本上是多余的。想想像Evernote或Picasa这样的应用。你拍了一张照片(或者看一下你以前拍过的照片)并选择“分享”。其中一个共享选项,以及Picasa,电子邮件等将是您的应用程序。我就是这样做的。