Android Camera PreviewCallBack在对话框中显示图像

时间:2015-04-03 12:40:33

标签: android

我有一个扩展Camera.PreviewCallBack

的类

在onPreviewFrame中,我调用AsyncTask来检查QR码

@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
    System.out.println("onPreviewFrame, should now decode");
    Camera.Size previewSize = camera.getParameters().getPreviewSize();
    new DecodeAsyncTask(previewSize.width, previewSize.height).execute(bytes);
}

如果解码成功,则调用;

cameraManager.c.takePicture(shutterCallback, rawCallback,jpegCallback);

takePicture的方法如下;

public void onPictureTaken(byte[] data, Camera camera) { 
    LayoutInflater inflater = (LayoutInflater) cxt.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
    Dialog settingsDialog = new Dialog(cxt);

    settingsDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    settingsDialog.getLayoutInflater().inflate(R.layout.qrimageviewer, null);
                   settingsDialog.show();
    Drawable image = new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length));

    imageview = (ImageView) activity.findViewById(R.id.qrimageview);

    imageview.setImageDrawable(image);

    try {
        System.out.println("TAKING PICTURE");


        Bitmap t1 = BitmapFactory.decodeByteArray(data , 0, data.length);
        Bitmap bitmap = Bitmap.createBitmap(t1);//.createBitmap(t1,0, 0, 400, 100);

        File myExternalFile = new File(cxt.getExternalFilesDir("/MyFileStorage/"), System.currentTimeMillis()+".    jpg");
        myExternalFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(myExternalFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.write(data);
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();

    } 
}

当调用takePicture时,我试图在对话框中显示拍摄的照片,以便用户可以选择是否保存图像。

我无法访问imageview以将其资源更改为从字节数组创建的位图。

膨胀的布局,qrimageviewer.xml;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/qrimageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:text="OK" 
        android:onClick="dismissListener"/>
</LinearLayout>

这是我创建和显示对话框的几次尝试之一;

Dialog settingsDialog = new Dialog(cxt);
settingsDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
settingsDialog.getLayoutInflater().inflate(R.layout.qrimageviewer, null);
settingsDialog.show();
Drawable image = new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length));
imageview = (ImageView) activity.findViewById(R.id.qrimageview);
imageview.setImageDrawable(image);

对不起,如果有任何错误,或没有提供足够的信息。 谢谢

-------- UPDATE ------- 它现在看到我的问题,就是当我找到视图时。 我收到了这个错误;

04-03 14:23:33.800: E/AndroidRuntime(26060): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference

我认为这是因为我试图从AsyncTask中找到视图并且它失败并返回null,因为布局被对话框夸大了。 我应该尝试从对话框中获取膨胀的视图吗? 我完全采取了错误的做法吗? 或者这是不可能的?

谢谢

2 个答案:

答案 0 :(得分:0)

使用字节数组创建一个位图并设置它以这种方式执行ImageView:

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
imageview.setImageBitmap(bitmap);

答案 1 :(得分:0)

好的,阅读太多并尝试了太多的例子是我自己的错。

我正在使用自定义布局来用于对话框。 相反,我需要以编程方式创建一个ImageView,然后将其添加到对话框中。 当你停止压力并以不同的方式看待它时,会更加简单。 添加代码以供将来参考。

LayoutInflater inflater = (LayoutInflater) cxt.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
Dialog settingsDialog = new Dialog(cxt);
                   settingsDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
ImageView imageView = new ImageView(cxt);

Bitmap bitmapa = BitmapFactory.decodeByteArray(data, 0, data.length);
imageView.setImageBitmap(bitmapa);

settingsDialog.addContentView(imageView,  new LayoutParams( LayoutParams.FILL_PARENT , LayoutParams.FILL_PARENT ));
settingsDialog.show();