【问题标题】:Android open camera from buttonAndroid从按钮打开相机
【发布时间】:2012-12-08 06:32:37
【问题描述】:

我希望这不是一个重复的问题,但我正在制作一个应用程序,我想要一个按钮来打开相机应用程序(单独的默认 android 相机)。我该怎么做呢?我知道有一个功能:

intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE)

我需要使用它吗?以及如何从 xml 文件中调用按钮?

我还需要担心存储该图片或视频,还是默认相机应用会处理这些问题?

【问题讨论】:

标签: android android-camera


【解决方案1】:

您可以创建相机意图并将其称为 startActivityForResult(intent)。

Intent intent = new 
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// start the image capture Intent 
startActivityForResult(intent, 
CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

【讨论】:

    【解决方案2】:
    public class camera_act extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_camera_act);
             ImageView imageView = findViewById(R.id.image);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent,90);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode,resultCode,data);
           Bitmap bitmap = data.getExtras.get("imageKey");
           imageView.setBitmapImage(bitmap);
                
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      我创建了一个库,用于从相机或厨房中挑选图像并进行裁剪

      试试这个,

      ImagePro.Java

      public class ImagePro
      {
          public static String TAG = "ImagePro";
          Activity activity;
          Uri mImageCaptureUri;
          public static int CAMERA_CODE = 64;
          public static int GALLERY_CODE = 74;
          public static int CROPPING_CODE = 84;
          private final static int REQUEST_PERMISSION_REQ_CODE = 704;
      
          public ImagePro(Activity activity) {
      
              this.activity = activity;
              this.outPutFile = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg");
      
              if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
      
                  ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_REQ_CODE);
              }
          }
      
          private void LogToast(String message) {
      
              try {
                  Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
              } catch (Exception e) {
                  e.printStackTrace();
              }
      
              Log.d(TAG, message);
          }
      
          private void Toast(String message) {
      
              try {
                  Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
          private void Log(String message) {
      
              Log.d(TAG, message);
          }
      
          /**
           * This function return captured image path
           *
           * @param requestCode on activity result requestCode
           * @param resultCode on activity result resultCode
           * @param intent on activity result intent
           * @return ImageDetails values
           */
          public ImageDetails getImagePath(int requestCode, int resultCode, Intent intent) {
      
              ImageDetails imageDetails = new ImageDetails();
      
              if(resultCode == Activity.RESULT_OK) {
      
                  if(requestCode == CAMERA_CODE) {
                      imageDetails.setUri(mImageCaptureUri);
                      imageDetails.setPath(mImageCaptureUri.getPath());
                      Bitmap bitmap = null;
      
                      try {
                          bitmap = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), mImageCaptureUri);
                      } catch (IOException e) {
                          LogToast(e.getMessage());
                          e.printStackTrace();
                      }
                      imageDetails.setBitmap(bitmap);
                      imageDetails.setFile(new File(mImageCaptureUri.getPath()));
      
                  } else if(requestCode == GALLERY_CODE) {
      
                      Uri uri = intent.getData();
      
                      imageDetails.setUri(uri);
                      Bitmap bitmap = null;
      
                      try {
                          bitmap = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), uri);
                      } catch (IOException e) {
                          LogToast(e.getMessage());
                          e.printStackTrace();
                      }
      
                      imageDetails.setBitmap(bitmap);
                      imageDetails.setFile(new File(uri.getPath()));
                      imageDetails.setPath(uri.getPath());
      
                  } else if(requestCode == CROPPING_CODE) {
                      try {
                          if(outPutFile.exists()){
      
                              imageDetails.setUri(Uri.fromFile(outPutFile));
                              imageDetails.setFile(outPutFile);
                              imageDetails.setPath(outPutFile.getPath());
                              Bitmap photo = decodeFile(outPutFile);
                              imageDetails.setBitmap(photo);
                          }
                          else {
                              LogToast("Error while save image");
                          }
                      } catch (Exception e) {
      
                          e.printStackTrace();
                          LogToast(e.getMessage());
                      }
                  }
      
              } else {
                  LogToast("user cancelled.");
              }
      
              return imageDetails;
          }
      
          /**
           * Open image pick dialog.<br/>
           * CAMERA_CODE</br>
           * GALLERY_CODE
           */
          public void openImagePickOption() {
      
              final CharSequence[] items = { "Capture Photo", "Choose from Gallery", "Cancel" };
      
              AlertDialog.Builder builder = new AlertDialog.Builder(activity);
              builder.setTitle("Add Photo!");
              builder.setItems(items, new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int item) {
      
                      if (items[item].equals("Capture Photo")) {
      
                          captureImage();
      
                      } else if (items[item].equals("Choose from Gallery")) {
      
                          pickImage();
      
                      } else if (items[item].equals("Cancel")) {
                          dialog.dismiss();
                      }
                  }
              });
              builder.show();
          }
      
          /**
           * decode from file to bitmap
           * @param f file
           * @return Bitmap data
           */
          private Bitmap decodeFile(File f) {
              try {
                  // decode image size
                  BitmapFactory.Options o = new BitmapFactory.Options();
                  o.inJustDecodeBounds = true;
                  BitmapFactory.decodeStream(new FileInputStream(f), null, o);
      
                  // Find the correct scale value. It should be the power of 2.
                  final int REQUIRED_SIZE = 512;
                  int width_tmp = o.outWidth, height_tmp = o.outHeight;
                  int scale = 1;
                  while (true) {
                      if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
                          break;
                      width_tmp /= 2;
                      height_tmp /= 2;
                      scale *= 2;
                  }
      
                  // decode with inSampleSize
                  BitmapFactory.Options o2 = new BitmapFactory.Options();
                  o2.inSampleSize = scale;
                  return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
              } catch (FileNotFoundException e) {
      
                  Log(e.getMessage());
              }
              return null;
          }
      
          /**
           * Capture image using camera <br/>
           * REQUEST_CODE = ImagePro.CAMERA_CODE
           */
          public void captureImage() {
      
              if(activity != null) {
      
                  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                  File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp1.jpg");
                  mImageCaptureUri = Uri.fromFile(f);
                  intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
                  activity.startActivityForResult(intent, CAMERA_CODE);
      
              } else {
      
                  LogToast("Activity not assigned");
              }
          }
      
          /**
           * pick image from gallery
           */
          public void pickImage() {
      
              Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
              activity.startActivityForResult(i, GALLERY_CODE);
          }
      
          /**
           * cropping the uri image
           * @param uri - open cropping dialog using the uri data
           */
          public void croppingImage(Uri uri) {
      
              CroppingIMG(uri);
          }
      
          int CROP_IMG_X=512;
          int CROP_IMG_Y=512;
      
          public void croppingImage(Uri uri, int cropX, int cropY) {
      
              CROP_IMG_X = cropX;
              CROP_IMG_Y = cropY;
      
              CroppingIMG(uri);
          }
      
          File outPutFile=null;
      
          private void CroppingIMG(Uri uri) {
      
              final ArrayList<CroppingOption> cropOptions = new ArrayList<>();
      
              Intent intent = new Intent("com.android.camera.action.CROP");
              intent.setType("image/*");
      
              List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities( intent, 0 );
              int size = list.size();
              if (size == 0) {
                  LogToast("Can't find image croping app");
              } else {
                  intent.setData(uri);
                  intent.putExtra("outputX", CROP_IMG_X);
                  intent.putExtra("outputY", CROP_IMG_Y);
                  intent.putExtra("aspectX", 1);
                  intent.putExtra("aspectY", 1);
                  intent.putExtra("scale", true);
      
                  //Create output file here
                  intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outPutFile));
      
                  if (size == 1) {
                      Intent i   = new Intent(intent);
                      ResolveInfo res = list.get(0);
      
                      i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
      
                      activity.startActivityForResult(i, CROPPING_CODE);
                  } else {
                      for (ResolveInfo res : list) {
                          final CroppingOption co = new CroppingOption();
      
                          co.title = activity.getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
                          co.icon = activity.getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
                          co.appIntent = new Intent(intent);
                          co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                          cropOptions.add(co);
                      }
      
                      CropingOptionAdapter adapter = new CropingOptionAdapter(activity.getApplicationContext(), cropOptions);
      
                      AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                      builder.setTitle("Choose Cropping App");
                      builder.setCancelable(false);
                      builder.setAdapter( adapter, new DialogInterface.OnClickListener() {
                          public void onClick( DialogInterface dialog, int item ) {
                              activity.startActivityForResult( cropOptions.get(item).appIntent, CROPPING_CODE);
                          }
                      });
      
                      builder.setOnCancelListener( new DialogInterface.OnCancelListener() {
                          @Override
                          public void onCancel( DialogInterface dialog ) {
      
                              if (mImageCaptureUri != null ) {
                                  activity.getContentResolver().delete(mImageCaptureUri, null, null );
                                  mImageCaptureUri = null;
                              }
                          }
                      } );
      
                      AlertDialog alert = builder.create();
                      alert.show();
                  }
              }
          }
      
          /**
           * Capture image using camera<br/>
           * REQUEST_CODE = User defined code<br/>
           * <br/>
           * @param iRequestCode User defined code
           */
          public void captureImage(int iRequestCode) {
      
              CAMERA_CODE = iRequestCode;
              captureImage();
          }
      
          /**
           * get path, bitmap, file and uri from image details object
           */
          public class ImageDetails {
      
              String path="";
              Bitmap bitmap=null;
              File file=null;
              Uri uri=null;
      
              public Uri getUri() {
                  return uri;
              }
      
              public void setUri(Uri uri) {
                  this.uri = uri;
              }
      
              public String getPath() {
                  return path;
              }
      
              public void setPath(String path) {
                  this.path = path;
              }
      
              public Bitmap getBitmap() {
                  return bitmap;
              }
      
              public void setBitmap(Bitmap bitmap) {
                  this.bitmap = bitmap;
              }
      
              public File getFile() {
                  return file;
              }
      
              public void setFile(File file) {
                  this.file = file;
              }
          }
      
          /**
           * Created by DP on 7/12/2016.
           */
          public class CroppingOption {
              public CharSequence title;
              public Drawable icon;
              public Intent appIntent;
          }
      
          public class CropingOptionAdapter extends ArrayAdapter {
              private ArrayList<CroppingOption> mOptions;
              private LayoutInflater mInflater;
      
              public CropingOptionAdapter(Context context, ArrayList<CroppingOption> options) {
      
                  super(context, R.layout.croping_selector, options);
                  mOptions  = options;
                  mInflater = LayoutInflater.from(context);
              }
      
              @Override
              public View getView(int position, View convertView, ViewGroup group) {
                  if (convertView == null)
                      convertView = mInflater.inflate(R.layout.croping_selector, null);
      
                  CroppingOption item = mOptions.get(position);
      
                  if (item != null) {
                      ((ImageView) convertView.findViewById(R.id.img_icon)).setImageDrawable(item.icon);
                      ((TextView) convertView.findViewById(R.id.txt_name)).setText(item.title);
      
                      return convertView;
                  }
      
                  return null;
              }
          }
      }
      

      MainActivity.java

      ImagePro imagePro;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              imagePro = new ImagePro(this);
          }
      
          public void onClickUploadImageButton(View view) {
      
              imagePro.openImagePickOption();
          }
      

      onActivityResult

      if(requestCode == CAMERA_CODE && resultCode == RESULT_OK) {
      
                  imageDetails = imagePro.getImagePath(CAMERA_CODE, RESULT_OK, data);
                  ivCrop.setImageBitmap(imageDetails.getBitmap());
      //imageDetails.getPath(), imageDetails.getBitmap(), imageDetails.getUri(), imageDetails.getFile
              }
      

      【讨论】:

        【解决方案4】:

        以下代码完全符合您的要求

        //在点击事件上使用这个意图

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent,CAMERA_REQUEST);

        //上面的代码用在'on activity Result'中

        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        
            super.onActivityResult(requestCode, resultCode, data);
            callbackManager.onActivityResult(requestCode, resultCode, data);
        
            if (requestCode == CAMERA_REQUEST) {
                Bitmap photo = (Bitmap) data.getExtras().get("data");
                image.setImageBitmap(photo);
            }
        }
        

        【讨论】:

        • 这将设置相机拍摄的图像的缩略图版本,并失去照片质量
        【解决方案5】:

        对我来说,这工作得很好。

         Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
         startActivity(intent);
        

        并将此权限添加到 mainfest 文件:

        <uses-permission android:name="android.permission.CAMERA">
        

        它会打开相机,在捕获图像后,它会将图像保存到带有新图像集的图库中。

        【讨论】:

          【解决方案6】:
           Button b = (Button)findViewById(R.id.Button01);
          
              b.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
                       Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                       startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
                  }
              });
          }
          
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              if (requestCode == CAMERA_PIC_REQUEST) {
                    Bitmap image = (Bitmap) data.getExtras().get("data");
                    ImageView imageview = (ImageView) findViewById(R.id.ImageView01); //sets imageview as the bitmap
                    imageview.setImageBitmap(image);
              }
          }
          

          【讨论】:

          • 什么是 camera_pic_request ?
          • @MuhammedFasil 是请求代码,您可以通过请求代码 startActivityforResult 并在调用 OnActivity 结果时返回相同的代码。在你的类中声明这样的代码private static final int CAMERA_PIC_REQUEST = 1337;
          • 根据thisdata.getExtras().get("data") 将得到只有一个缩略图
          • @soshial 你是对的。 data.getExtras().get("data") 返回缩略图并丢失图像质量...
          【解决方案7】:

          你可以使用下面的代码

                   Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
          
                          pic = new File(Environment.getExternalStorageDirectory(),
                                  mApp.getPreference().getString(Common.u_id, "") + ".jpg");
          
                          picUri = Uri.fromFile(pic);
          
                          cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, picUri);
          
                          cameraIntent.putExtra("return-data", true);
                          startActivityForResult(cameraIntent, PHOTO);
          

          【讨论】:

            【解决方案8】:

            要调用相机,您可以使用:

            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
            startActivity(intent);
            

            图像将自动保存在默认目录中。

            并且你需要在你的 AndroidManifest.xml 中设置摄像头的权限:

            <uses-permission android:name="android.permission.CAMERA"> </uses-permission>
            

            【讨论】:

            • 我不了解你,但在我的情况下,它可以在未经许可的情况下工作
            • 当您通过意图启动图像捕获操作时,无需包含 CAMERA 权限。
            【解决方案9】:

            我知道回复有点晚了,但是您可以使用以下语法,因为它对我很有效

            Camera=(Button)findViewById(R.id.CameraID);
            Camera.setOnClickListener(new OnClickListener() {
            
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Intent Intent3=new   Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
                        startActivity(Intent3); 
                    }
                });
            

            【讨论】:

              【解决方案10】:

              您可以创建一个相机意图并将其称为 startActivityForResult(intent)。

              Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
              
                 // start the image capture Intent
              startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
              

              【讨论】:

                【解决方案11】:

                您对 Intent 中使用的操作是正确的,但这不是您唯一需要做的事情。您还必须添加

                startActivityForResult(intent, YOUR_REQUEST_CODE);
                

                要完成所有操作并检索实际图片,您可以查看以下线程。

                Android - Capture photo

                【讨论】:

                  猜你喜欢
                  • 2018-07-16
                  • 1970-01-01
                  • 2017-05-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多