【问题标题】:Preview captured Image NullpointerException预览捕获的图像 NullpointerException
【发布时间】:2016-11-10 13:43:47
【问题描述】:
public void openDialogToAddReminder(final Context context, final DbHelper dbHelper, final int Rem_id, final int Med_id) {
    LayoutInflater layoutInflaterAndroid = LayoutInflater.from(context);
    final View mView = layoutInflaterAndroid.inflate(R.layout.add_reminders_dialog, null);
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
    alertDialogBuilder.setView(mView);
    captureImage = (ImageButton) mView.findViewById(R.id.capture_image);
    captureImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            selectImage(context);
        }
    });
    alertDialogBuilder
            .setCancelable(false)
            .setPositiveButton(dialog_title, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            })
            .setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
    AlertDialog alertDialog = alertDialogBuilder.create();
    // show it
    alertDialog.show();
}
public void selectImage(final Context context) {
    final CharSequence[] items = { "Take Photo", "Choose from Gallery",
            "Cancel" };
    android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(context);
    builder.setTitle("Add Photo");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            boolean result= Utility.checkPermission(context);
            if (items[item].equals("Take Photo")) {
                userChoosenTask ="Take Photo";
                if(result)
                    cameraIntent(context);
            } else if (items[item].equals("Choose from Gallery")) {
                userChoosenTask ="Choose from Gallery";
                if(result)
                    galleryIntent(context);
            } else if (items[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}
public void galleryIntent(Context context)
{
    Log.i("Context ",context.toString());
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);//
    startActivityForResult(Intent.createChooser(intent, "Select File"),SELECT_FILE);
}
public void cameraIntent(Context context)
{
    Intent takingPictureCameraintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takingPictureCameraintent.resolveActivity(context.getPackageManager())!=null)
        startActivityForResult(takingPictureCameraintent, REQUEST_CAMERA);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_FILE)
            onSelectFromGalleryResult(data);
        else if (requestCode == REQUEST_CAMERA)
            onCaptureImageResult(data);
    }
}
public void onCaptureImageResult(Intent data)
{
    try{
        Bundle extras=data.getExtras();
        Bitmap thumbnail = (Bitmap) extras.get("data");
        Log.i("Image Camera Bitmap ",thumbnail.toString());
        ByteArrayOutputStream bytes=new ByteArrayOutputStream();
        thumbnail.compress(Bitmap.CompressFormat.JPEG, 90,bytes);
        captureImage.setImageBitmap(thumbnail);
        saveToGallery(thumbnail);
    }
    catch (Exception e){e.printStackTrace();}
}

add_reminders_dialog.xml

<?xml version = "1.0" encoding="utf-8"?>
<RelativeLayout android:layout_marginLeft="@dimen/activity_horizontal_margin"
                android:layout_marginRight="@dimen/activity_vertical_margin"
                android:layout_marginTop="@dimen/activity_horizontal_margin"
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/r1"
                xmlns:app="http://schemas.android.com/apk/res-auto">

    <android.support.v7.widget.CardView
            android:id="@+id/cardview_medicine_image"
            android:layout_marginTop="20dp"
            app:contentPadding="@dimen/activity_horizontal_margin"
            android:layout_below="@+id/cardview_medicine_time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

    <ImageButton
            android:layout_width="match_parent"
            android:layout_height="170dp"
            android:background="#424242"
            android:padding="10dp"
            android:clickable="true"
            android:src="@drawable/icon_camera"
            android:scaleType="fitCenter"
            android:id="@+id/capture_image"/>
    </android.support.v7.widget.CardView>
</RelativeLayout>

在此处获取 NullPointerException

captureImage.setImageBitmap(thumbnail);

我不知道为什么我的 captureImage 为空。正如我在全球范围内定义的那样。为什么它是空的,因为我在对话框中定义了它。

【问题讨论】:

  • “突出显示”的行是哪一行?我在你的问题中看不到它。同时发布您的add_reminders_dialog.xml
  • captureImage.setImageBitmap(thumbnail);这是突出显示的文本,还添加了 xml 文件 @pleft
  • 语法和元数据

标签: java android nullpointerexception android-camera


【解决方案1】:

您的captureImage 属于您的第一个警报对话框的视图(在openDialogToAddReminder 方法中创建的那个。

我怀疑在单击captureImage 以选择图像时,此对话框会被关闭,因此它会破坏captureImage 引用,因此当调用onActivityResult 时不再有captureImage 对象。

如果您在AlertDialog.Builder 上设置了dismiss listener,则可以检查上述内容,例如

 alertDialogBuilder.setOnDismissListener(new OnDismissListener() {

    @Override
    public void onDismiss(DialogInterface dialog) {
        Log.d("onDismiss");
    }
});

把这段代码放在上面:

AlertDialog alertDialog = alertDialogBuilder.create();

编辑:
如果您在 logcat 上收到:“onDismiss”,这意味着我的假设是正确的。尝试通过以下方式解决:

alertDialog.setCanceledOnTouchOutside(false);

【讨论】:

  • 它运行.. 输出:在关闭 android.support.v7.widget.AppCompatImageButton{424bfa38 VFED..C. ......ID 38,40-554,380 #7f0f0100 app:id/capture_image} 当我添加 System.out.println("on capture context on dismiss "+captureImage);这一行
  • 如果您在 logcat 上看到“onDismiss”行,请修改我上面的答案并尝试将 setCanceledOnTouchOutside 设置为 false
  • onDismiss 是否会在 setCanceledOnTouchOutside 设置为 false 之后被触发?
  • 因此,如果您在 captureImage.setImageBitmap(thumbnail); 之前添加 System.out.println("captureImage is null? : " + (captureImage == null));,您会得到“captureImage 为 null?:true”或“captureImage 为 null?:false”?
  • 兄弟..我换了手机,它的工作就像一个魅力,非常感谢兄弟,
猜你喜欢
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多