【问题标题】:Android How can I call Camera or Gallery Intent TogetherAndroid 如何同时调用相机或图库意图
【发布时间】:2012-07-31 03:57:13
【问题描述】:

如果我想从本地相机捕获图像,我可以这样做:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(intent, IMAGE_CAPTURE);

如果我想从图库中获取图片,我可以这样做:

Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,
                        "Select Picture"), SELECT_PICTURE);

我想知道如何将以上两者放在一起。
这意味着从图库或捕获照片中获取图像

是否有任何示例代码可以做到这一点? 谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    如果您想从CameraGallery Intent Together 拍照,请查看以下链接。同样的问题也在这里发布。

    Capturing image from gallery & camera in android

    更新代码:

    检查下面的代码,在此代码中与您想要进入列表视图的代码不同,但它在对话框中提供了从图库或相机中选择图像的选项。

    public class UploadImageActivity extends Activity {
    ImageView img_logo;
    protected static final int CAMERA_REQUEST = 0;
    protected static final int GALLERY_PICTURE = 1;
    private Intent pictureActionIntent = null;
    Bitmap bitmap;
    
        String selectedImagePath;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
    
        img_logo= (ImageView) findViewById(R.id.imageView1);
        img_logo.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                startDialog();
            }
    
        });
    }
    
    private void startDialog() {
        AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(
                getActivity());
        myAlertDialog.setTitle("Upload Pictures Option");
        myAlertDialog.setMessage("How do you want to set your picture?");
    
        myAlertDialog.setPositiveButton("Gallery",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface arg0, int arg1) {
                        Intent pictureActionIntent = null;
    
                        pictureActionIntent = new Intent(
                                Intent.ACTION_PICK,
                                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                         startActivityForResult(
                                pictureActionIntent,
                                GALLERY_PICTURE);
    
                    }
                });
    
        myAlertDialog.setNegativeButton("Camera",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface arg0, int arg1) {
    
                        Intent intent = new Intent(
                                MediaStore.ACTION_IMAGE_CAPTURE);
                        File f = new File(android.os.Environment
                                .getExternalStorageDirectory(), "temp.jpg");
                        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                                Uri.fromFile(f));
    
                         startActivityForResult(intent,
                                CAMERA_REQUEST);
    
                    }
                });
        myAlertDialog.show();
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        super.onActivityResult(requestCode, resultCode, data);
    
        bitmap = null;
        selectedImagePath = null;
    
        if (resultCode == RESULT_OK && requestCode == CAMERA_REQUEST) {
    
            File f = new File(Environment.getExternalStorageDirectory()
                    .toString());
            for (File temp : f.listFiles()) {
                if (temp.getName().equals("temp.jpg")) {
                    f = temp;
                    break;
                }
            }
    
            if (!f.exists()) {
    
                Toast.makeText(getBaseContext(),
    
                "Error while capturing image", Toast.LENGTH_LONG)
    
                .show();
    
                return;
    
            }
    
            try {
    
                bitmap = BitmapFactory.decodeFile(f.getAbsolutePath());
    
                bitmap = Bitmap.createScaledBitmap(bitmap, 400, 400, true);
    
                int rotate = 0;
                try {
                    ExifInterface exif = new ExifInterface(f.getAbsolutePath());
                    int orientation = exif.getAttributeInt(
                            ExifInterface.TAG_ORIENTATION,
                            ExifInterface.ORIENTATION_NORMAL);
    
                    switch (orientation) {
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotate = 270;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotate = 180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotate = 90;
                        break;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Matrix matrix = new Matrix();
                matrix.postRotate(rotate);
                bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                        bitmap.getHeight(), matrix, true);
    
    
    
                img_logo.setImageBitmap(bitmap);
                //storeImageTosdCard(bitmap);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        } else if (resultCode == RESULT_OK && requestCode == GALLERY_PICTURE) {
            if (data != null) {
    
                Uri selectedImage = data.getData();
                String[] filePath = { MediaStore.Images.Media.DATA };
                Cursor c = getContentResolver().query(selectedImage, filePath,
                        null, null, null);
                c.moveToFirst();
                int columnIndex = c.getColumnIndex(filePath[0]);
                selectedImagePath = c.getString(columnIndex);
                c.close();
    
                if (selectedImagePath != null) {
                    txt_image_path.setText(selectedImagePath);
                }
    
                bitmap = BitmapFactory.decodeFile(selectedImagePath); // load
                // preview image
                bitmap = Bitmap.createScaledBitmap(bitmap, 400, 400, false);
    
    
    
                img_logo.setImageBitmap(bitmap);
    
            } else {
                Toast.makeText(getApplicationContext(), "Cancelled",
                        Toast.LENGTH_SHORT).show();
            }
        }
    
    }
    
    
    }
    

    同时添加权限:

    <uses-permission android:name="android.permission.CAMERA" />
    
     <uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />
    

    将图像存储到 SD 卡:

    private void storeImageTosdCard(Bitmap processedBitmap) {
        try {
            // TODO Auto-generated method stub
    
            OutputStream output;
            // Find the SD Card path
            File filepath = Environment.getExternalStorageDirectory();
            // Create a new folder in SD Card
            File dir = new File(filepath.getAbsolutePath() + "/appName/");
            dir.mkdirs();
    
            String imge_name = "appName" + System.currentTimeMillis()
                    + ".jpg";
            // Create a name for the saved image
            File file = new File(dir, imge_name);
            if (file.exists()) {
                file.delete();
                file.createNewFile();
            } else {
                file.createNewFile();
    
            }
    
            try {
    
                output = new FileOutputStream(file);
    
                // Compress into png format image from 0% - 100%
                processedBitmap
                        .compress(Bitmap.CompressFormat.PNG, 100, output);
                output.flush();
                output.close();
    
                int file_size = Integer
                        .parseInt(String.valueOf(file.length() / 1024));
                System.out.println("size ===>>> " + file_size);
                System.out.println("file.length() ===>>> " + file.length());
    
                selectedImagePath = file.getAbsolutePath();
    
    
    
            }
    
            catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    }
    

    【讨论】:

    • 检查我编辑的代码。在此对话框中提供了从图库/相机中选择图像的选项。
    • 你太棒了。但是你有没有发现一个问题。从图库中选择时,选择照片后,在imageview中显示的图像会旋转90度?不知道是我的设备问题还是别人的问题?你能帮忙检查一下吗?
    • 我认为您的应用在通过 Intent 拍照时不需要相机权限。
    • @EdwardBrey 感谢您的建议。我会查一下。现在我有点忙。
    • 您还需要 android.permission.READ_EXTERNAL_STORAGE 权限。
    【解决方案2】:

    假设您有两个意图。一个会打开相机,一个会打开画廊。我将在示例代码中调用这些cameraIntent 和gallerIntent。您可以使用意图选择器将这两者结合起来:

    科特林

    val chooser = Intent.createChooser(galleryIntent, "Some text here")
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(cameraIntent))
    startActivityForResult(chooser, requestCode)
    

    Java

    Intent chooser = Intent.createChooser(galleryIntent, "Some text here");
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { cameraIntent });
    startActivityForResult(chooser, requestCode);
    

    正如您所问的,这就是如何将两者放在一起(无需制作自己的 UI/对话框)。

    【讨论】:

      【解决方案3】:

      如果要显示手机中安装的所有可以处理照片的应用,例如相机、图库、Dropbox 等。

      你可以这样做:

      1.- 询问所有可用的意图:

          Intent camIntent = new Intent("android.media.action.IMAGE_CAPTURE");
          Intent gallIntent=new Intent(Intent.ACTION_GET_CONTENT);
          gallIntent.setType("image/*"); 
      
          // look for available intents
          List<ResolveInfo> info=new ArrayList<ResolveInfo>();
          List<Intent> yourIntentsList = new ArrayList<Intent>();
          PackageManager packageManager = context.getPackageManager();
          List<ResolveInfo> listCam = packageManager.queryIntentActivities(camIntent, 0);
          for (ResolveInfo res : listCam) {
              final Intent finalIntent = new Intent(camIntent);
              finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
              yourIntentsList.add(finalIntent);
              info.add(res);
          }
          List<ResolveInfo> listGall = packageManager.queryIntentActivities(gallIntent, 0);
          for (ResolveInfo res : listGall) {
              final Intent finalIntent = new Intent(gallIntent);
              finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
              yourIntentsList.add(finalIntent);
              info.add(res);
          }
      

      2.- 显示带有项目列表的自定义对话框:

          AlertDialog.Builder dialog = new AlertDialog.Builder(context);
          dialog.setTitle(context.getResources().getString(R.string.select_an_action));
          dialog.setAdapter(buildAdapter(context, activitiesInfo),
                  new DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int id) {
                          Intent intent = intents.get(id);
                          context.startActivityForResult(intent,1);
                      }
                  });
      
          dialog.setNeutralButton(context.getResources().getString(R.string.cancel),
                  new android.content.DialogInterface.OnClickListener() {
                      @Override
                      public void onClick(DialogInterface dialog, int which) {
                          dialog.dismiss();
                      }
                  });
          dialog.show();
      

      这是一个完整的例子:https://gist.github.com/felixgborrego/7943560

      【讨论】:

      • 干得好@Felix!我有一个问题,如何从片段中调用此静态方法?问题是 onActivityResult 在活动中被触发。
      【解决方案4】:

      我想我以前遇到过你的情况。一个想法是,我们将创建一个带有可选项目的单项列表警报对话框,并且每个项目将执行由您自己的意图定义的独特功能。如果您想要项目列表中每个元素的图标,则需要做更多的工作。希望对您有所帮助。

          String title = "Open Photo";
          CharSequence[] itemlist ={"Take a Photo",
                        "Pick from Gallery",
                        "Open from File"};
      
          AlertDialog.Builder builder = new AlertDialog.Builder(this);
          builder.setIcon(R.drawable.icon_app);
          builder.setTitle(title);
          builder.setItems(itemlist, new DialogInterface.OnClickListener() {
      
              @Override
              public void onClick(DialogInterface dialog, int which) {
                  switch (which) {
                  case 0:// Take Photo
                      // Do Take Photo task here
                      break;
                  case 1:// Choose Existing Photo
                      // Do Pick Photo task here
                      break;
                  case 2:// Choose Existing File
                      // Do Pick file here
                      break;
                  default:
                      break;
                  }
              }
          });
          AlertDialog alert = builder.create();
          alert.setCancelable(true);
          alert.show();
      

      【讨论】:

        【解决方案5】:

        事实上,您的对话框标题是“选择一个动作”,这意味着该对话框实际上是一个 Intent 选择器。不是用户自定义的对话框。每个项目都代表一个 Intent。

        public void click(View view) {
                File file = getExternalFilesDir(Environment.DIRECTORY_DCIM);
                Uri cameraOutputUri = Uri.fromFile(file);
                Intent intent = getPickIntent(cameraOutputUri);
                startActivityForResult(intent, -1);
            }
        
            private Intent getPickIntent(Uri cameraOutputUri) {
                final List<Intent> intents = new ArrayList<Intent>();
        
                if (true) {
                    intents.add(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI));
                }
        
                if (true) {
                    setCameraIntents(intents, cameraOutputUri);
                }
        
                if (intents.isEmpty()) return null;
                Intent result = Intent.createChooser(intents.remove(0), null);
                if (!intents.isEmpty()) {
                    result.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new Parcelable[] {}));
                }
                return result;
        
        
            }
        
            private void setCameraIntents(List<Intent> cameraIntents, Uri output) {
                final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                final PackageManager packageManager = getPackageManager();
                final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
                for (ResolveInfo res : listCam) {
                    final String packageName = res.activityInfo.packageName;
                    final Intent intent = new Intent(captureIntent);
                    intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                    intent.setPackage(packageName);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, output);
                    cameraIntents.add(intent);
                }
            }
        

        如果在 OS >= 23 上运行,您可能需要自己解决权限

        这是我的演示:(由于操作系统不同导致的外观差异)

        【讨论】:

        • 这张图片帮助我更好地理解它。
        【解决方案6】:

        在您的 XML 布局中创建一个按钮并添加属性 android:onClick="takeAPicture" 然后在您的主要活动中从onClick 属性中创建一个具有相同名称的方法。

        public void takeAPicture(View view){
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                startActivityForResult(intent, IMAGE_CAPTURE);
        }
        

        当您想从图库中获取图像时,只需执行另一种方法:

        public void getImageFromGallery(View view) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,
                            "Select Picture"), SELECT_PICTURE);
        } 
        

        【讨论】:

        • 我想像上面截图一样把它们放在一起
        • 你能用图片按钮来创建吗?
        【解决方案7】:

        public static Intent getPickImageIntent(Context context) {
            Intent chooserIntent = null;
        
            List<Intent> intentList = new ArrayList<>();
        
            Intent pickIntent = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            takePhotoIntent.putExtra("return-data", true);
            takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context)));
            intentList = addIntentsToList(context, intentList, pickIntent);
            intentList = addIntentsToList(context, intentList, takePhotoIntent);
        
            if (intentList.size() > 0) {
                chooserIntent = Intent.createChooser(intentList.remove(intentList.size() - 1),
                        context.getString(R.string.pick_image_intent_text));
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[]{}));
            }
        
            return chooserIntent;
        }
        
        private static List<Intent> addIntentsToList(Context context, List<Intent> list, Intent intent) {
            List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0);
            for (ResolveInfo resolveInfo : resInfo) {
                String packageName = resolveInfo.activityInfo.packageName;
                Intent targetedIntent = new Intent(intent);
                targetedIntent.setPackage(packageName);
                list.add(targetedIntent);
            }
            return list;
        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          • 2011-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多