我有一个扩展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,因为布局被对话框夸大了。 我应该尝试从对话框中获取膨胀的视图吗? 我完全采取了错误的做法吗? 或者这是不可能的?
谢谢
答案 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();