java - 相机不工作

标签 java android android-intent camera android-context

我有 MainActivity,其中包含与相机相关的所有功能。 当我从 mainactivity 调用相机打开功能时工作正常。但是当我通过适配器调用主要 Activity 相机功能时,它给出了以下错误:-

1-10 15:53:48.494 5741-5741/user.com.test2 E/InputEventReceiver: Exception dispatching input event. 11-10 15:53:48.494 5741-5741/user.com.test2 E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 11-10 15:53:48.494 5741-5741/user.com.test2 E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference at android.app.Activity.startActivityForResult(Activity.java:3794) at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) at android.app.Activity.startActivityForResult(Activity.java:3755) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:871) at user.com.hlthee.Reminders.galleryIntent(Reminders.java:1049) at user.com.hlthee.Reminders$24.onClick(Reminders.java:1033) at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1082) at android.widget.AdapterView.performItemClick(AdapterView.java:305) at android.widget.AbsListView.performItemClick(AbsListView.java:1146) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3072) at android.widget.AbsListView.onTouchUp(AbsListView.java:3920) at android.widget.AbsListView.onTouchEvent(AbsListView.java:3657) at android.view.View.dispatchTouchEvent(View.java:8476) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2400) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2093) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2406) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2372) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1719) at android.app.Dialog.dispatchTouchEvent(Dialog.java:765) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2333) at android.view.View.dispatchPointerEvent(View.java:8671) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4171) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4037) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3587) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3640) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3606) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3723) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3614) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3780) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3587) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3640) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3606) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3614) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3587) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5855) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5829) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5800) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5945) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:143) at androi 11-10 15:53:48.494 5741-5741/user.com.test2 D/AndroidRuntime: Shutting down VM

从适配器调用:-

 @Override
    public void onBindViewHolder(final MedicineAdaptor.ViewHolder holder, final int position) {


        holder.ReminderCardView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {

                Log.i("On Long Pressed","Yes");
                //Toast.makeText(context,Integer.toString(listMedicine.getId()),Toast.LENGTH_LONG).show();

                //Creating the instance of PopupMenu

                final PopupMenu popupMenu=new
                        PopupMenu(context,holder.ReminderCardView);

                //Inflating the Popup using xml file
                popupMenu.getMenuInflater().inflate(R.menu.reminder_options,popupMenu.getMenu());

                //registering popup with OnMenuItemClickListener

                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){


                    @Override
                    public boolean onMenuItemClick(MenuItem item) {

                        if (item.getTitle().equals("Edit Details"))
                        {


                            //Edit details
                            //((AddReminder)mactivity).openDialogToAddReminder();
                            Reminders reminders=new Reminders();
                            reminders.openDialogToAddReminder(context, dbHelper, listMedicine.getRemender_id(),listMedicine.getId());

                            update(listMedicine);

                        }                      

                        return false;
                    }
                });

                popupMenu.show(); //showing popup menu


                return false;
            }
        });

    }

主 Activity .java

public void cameraIntent(Context context)
    {
        Intent takingPictureCameraintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        **if (takingPictureCameraintent.resolveActivity(getPackageManager())!=null)**
            startActivityForResult(takingPictureCameraintent, REQUEST_CAMERA);
    }

logcat 在上面突出显示的行显示错误:-

完成的研究:- 根据我使用 google 和 stackoverfollow 的了解。这是因为上下文。

所以我试过了 上下文.getPackageManager()

但是通过这样做,相机在 mainActivity 中也不起作用。

编辑:--

主 Activity .java

  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();}

    }

更新:-

public void cameraIntent(Context context)
    {
        Intent takingPictureCameraintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (context.getClass().getSimpleName().equals("ListReminders"))
        {
            context.**startActivityForResult()** // bolded region is red color. means no fuction found. 
        }
        else
        {
            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);** // getting nullpointerexception
            saveToGallery(thumbnail);
        }
        catch (Exception e){e.printStackTrace();}

    }

最佳答案

试试这个。
由于您正在从适配器类调用 cameraIntent。在此方法中,startActivtyForResult() 是 Activity 类的方法。当您从适配器调用时,您需要调用 context.startActivtyForResult() 而不是调用 startActivtyForResult()

您可以通过在openDialogToAddReminder 中添加一个callType 参数来实现它。

if(callType.equals("fromActivity"))
{
    startActivtyForResult(....);
}
else
{
    ((Activity)context).startActivityForResult();
}

关于java - 相机不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40525888/

相关文章:

java - Dropwizard 1.0.0-rc2 registerDefaultExceptionMappers 无法识别的字段

java - 当存在 2 个版本的库时,按需在 tomcat 中加载类?

android - 适用于 Xamarin.Android 和 Xamarin.iOS 的 native Google Plus 登录

Android:如何从主屏幕删除/卸载应用程序快捷方式?

android - 使用 Intent 将数据从一个 Activity 传输到另一个 Activity

android - 无法正确获取 "android.intent.action.SEND" Intent 的路径

android - 当从外部应用程序请求图像时,我的应用程序必须覆盖哪些 Intent 过滤器才能出现在选择器中?

java - 从 play framework 2.0.8 迁移到 2.1.0 错误 : cache play already exists

java - 从非 Ui 线程获取系统默认颜色

android - 为什么我的 this.setState 在函数中不起作用?