【问题标题】:Choose image from gallery or take from camera从图库中选择图像或从相机拍摄
【发布时间】:2016-03-30 10:25:46
【问题描述】:

我必须制作一个按钮,用于从图库中选择图像或从相机中拍摄。

 private void showFileChooser() {
    Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(takePicture, 0);
    Intent pickPhoto = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(pickPhoto , 1);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    switch(requestCode) {
        case 0:
            if(resultCode == RESULT_OK){
                Uri selectedImage = imageReturnedIntent.getData();
                imageView.setImageURI(selectedImage);
            }

            break;
        case 1:
            if(resultCode == RESULT_OK){
                Uri selectedImage = imageReturnedIntent.getData();
                imageView.setImageURI(selectedImage);
            }
            break;
    }
}

结果有效。如果我从图库中选择,imageviewer 将查看它,如果我选择从相机拍照,它也可以工作。 问题是,在我的 showFileChooser() 方法中,我所有的意图都在同一时间运行,所以当我从画廊中选择时,相机仍然在运行。我选择相机,画廊也开张了。我想我应该在 switch case 模式下实现我的代码,但我不明白该怎么做。请帮助解决我的初学者问题。

【问题讨论】:

标签: android camera gallery


【解决方案1】:

添加alertDialog,然后在onActivityResult 中使用REQUEST_CAMERASELECT_FILE 而不是0 和1 的大小写。您将在代码中声明:

private static final int REQUEST_CAMERA = 1;
private static final int SELECT_FILE = 2;

final CharSequence[] items = {"Take Photo", "Choose from Library", "Cancel"};
            android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(mActivity);
            builder.setTitle("Add Photo!");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {

                    if (items[item].equals("Take Photo")) {
                        PROFILE_PIC_COUNT = 1;
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(intent, REQUEST_CAMERA);
                    } else if (items[item].equals("Choose from Library")) {
                        PROFILE_PIC_COUNT = 1;
                        Intent intent = new Intent(
                                Intent.ACTION_PICK,
                                MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(intent,SELECT_FILE);
                    } else if (items[item].equals("Cancel")) {
                        PROFILE_PIC_COUNT = 0;
                        dialog.dismiss();
                    }
                }
            }); 
            builder.show();

【讨论】:

  • 如何在我的名为 showFileChooser() 的方法中实现这一点?我不使用直接实现,但是我使用了一个按钮来调用该方法,然后在我的帖子中是方法声明
  • 只需将整个代码添加到您的 showFileChooser() 方法中。你会很高兴的。这基本上添加了一个警报对话框,供用户在画廊和相机之间进行选择,然后相应地调用 startActivityForResult()。
  • 通过 private static final int REQUEST_CAMERA = 1 全局声明这两行;私有静态最终 int SELECT_FILE = 2;
【解决方案2】:

您应该首先决定您要执行的操作,如下所示

  public class PicModeSelectDialogFragment extends DialogFragment {

        private String[] picMode = {"Camera", "Gallery"};

        private IPicModeSelectListener iPicModeSelectListener;

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setItems(picMode, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    if (iPicModeSelectListener != null)
                        iPicModeSelectListener.onPicModeSelected(Constants.PicModes.values()[which]);
                }
            });
            return builder.create();
        }

        public void setiPicModeSelectListener(IPicModeSelectListener iPicModeSelectListener) {
            this.iPicModeSelectListener = iPicModeSelectListener;
        }

        public interface IPicModeSelectListener {
            void onPicModeSelected(Constants.PicModes modes);
        }
    }

之后,您可以触发意图打开相机或图库,如下所示:

if(openCamera){
  Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
}else{
//open gallery
 Intent intent = new Intent(Intent.ACTION_GET_CONTENT).setType("image/*");
} 

【讨论】:

  • 这是一门课吗?但我在一个名为 showFileChooser() 的方法中实现了我的代码
  • 然后你也可以先在 showFileChooser() 中打开一个对话框询问用户他的操作,然后 onItemClick() 你可以执行相应的操作。
  • 你能说明你的模式吗?
【解决方案3】:

首先创建一个包含两个按钮的对话框,要求用户选择GalleryCamera.On Click of buttons set Intent for Picking Images,如下所示:

public void dialog()
    {
        final Dialog dialog = new Dialog(getActivity(), R.style.cust_dialog);
        dialog.setTitle("Upload From");
        dialog.setContentView(R.layout.dialog_pop_up_gallery_camera);

        dialog.setTitle("Select an Option...");
        TextView txt_gallry=(TextView)dialog.findViewById(R.id.textView_gallery);
        TextView txt_camera=(TextView)dialog.findViewById(R.id.textView_camera);

        txt_gallry.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                             Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                            i.setType("image/*");
                            startActivityForResult(i, PHOTO_PICKER_ID);
            }
        });
        txt_camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();



                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                //cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                File fil = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(fil));
                startActivityForResult(cameraIntent, REQUEST_CODE_CAPTURE_IMAGE);
            }
        });
        dialog.show();
    }

这是对话框的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:gravity="center|center_vertical"
              android:background="@color/lightpurple">

    <TextView
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:text="Gallery"
        android:textColor="@color/white"
        android:textSize="18sp"
        android:padding="10dp"

        android:drawableLeft="@drawable/galery_small"
        android:drawablePadding="15dp"
        android:id="@+id/textView_gallery"/>
    <TextView
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:textColor="@color/white"
        android:textSize="18sp"
        android:text="Camera"
        android:drawablePadding="15dp"
        android:drawableLeft="@drawable/camera"
        android:padding="10dp"
        android:id="@+id/textView_camera"/>
</LinearLayout>

【讨论】:

  • 那么,我应该在我的主要活动之外进行另一项活动吗?
  • 不,只需将此代码放在您的主活动中,然后在单击按钮时调用此对话框,您正在调用showFileChooser() ,并将xml 放在您的res/layout 文件夹中。
  • @BurhanuddinRabbani 你完成了吗?或者需要帮助?
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2018-09-15
相关资源
最近更新 更多