代码之家  ›  专栏  ›  技术社区  ›  Alexander Oleynikov

Android摄像头意图

  •  90
  • Alexander Oleynikov  · 技术社区  · 15 年前

    我需要将一个intent推送到默认的camera应用程序,让它拍照、保存并返回一个uri。有办法吗?

    6 回复  |  直到 7 年前
        1
  •  170
  •   aysonje    9 年前
    private static final int TAKE_PICTURE = 1;    
    private Uri imageUri;
    
    public void takePhoto(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File photo = new File(Environment.getExternalStorageDirectory(),  "Pic.jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(photo));
        imageUri = Uri.fromFile(photo);
        startActivityForResult(intent, TAKE_PICTURE);
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case TAKE_PICTURE:
            if (resultCode == Activity.RESULT_OK) {
                Uri selectedImage = imageUri;
                getContentResolver().notifyChange(selectedImage, null);
                ImageView imageView = (ImageView) findViewById(R.id.ImageView);
                ContentResolver cr = getContentResolver();
                Bitmap bitmap;
                try {
                     bitmap = android.provider.MediaStore.Images.Media
                     .getBitmap(cr, selectedImage);
    
                    imageView.setImageBitmap(bitmap);
                    Toast.makeText(this, selectedImage.toString(),
                            Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT)
                            .show();
                    Log.e("Camera", e.toString());
                }
            }
        }
    }
    
        2
  •  20
  •   Alex Lockwood Nigel Hawkins    13 年前

    试试下面我找到的 here

    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    startActivityForResult(intent, 0);
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (resultCode == Activity.RESULT_OK && requestCode == 0) {
        String result = data.toURI();
        // ...
      }
    }
    
        3
  •  7
  •   Albert Vila Calvo    9 年前

    我花了几个小时才把这件事做好。几乎是复制粘贴的代码 developer.android.com ,差别不大。

    在上请求此权限 AndroidManifest.xml :

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

    对你 Activity ,首先定义:

    static final int REQUEST_IMAGE_CAPTURE = 1;
    private Bitmap mImageBitmap;
    private String mCurrentPhotoPath;
    private ImageView mImageView;
    

    那就开枪吧 Intent 在一个 onClick :

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (cameraIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
            Log.i(TAG, "IOException");
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
            startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
    

    添加以下支持方法:

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  // prefix
                ".jpg",         // suffix
                storageDir      // directory
        );
    
        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = "file:" + image.getAbsolutePath();
        return image;
    }
    

    然后接收结果:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            try {
                mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath));
                mImageView.setImageBitmap(mImageBitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    使它成功的是 MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)) ,它不同于 android.com开发者 . 原始代码给了我一个 FileNotFoundException .

        4
  •  0
  •   NatNgs    7 年前

    试试下面我发现的 a link

    如果您的应用以m及以上版本为目标并声明为使用未授予的相机权限,则尝试使用此操作将导致安全异常。

    EasyImage.openCamera(Activity activity, int type);

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() {
            @Override
            public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) {
                //Some error handling
            }
    
            @Override
            public void onImagesPicked(List<File> imagesFiles, EasyImage.ImageSource source, int type) {
                //Handle the images
                onPhotosReturned(imagesFiles);
            }
        });
    }
    
        5
  •  0
  •   Max von Hippel MD. Sahib Bin Mahboob    7 年前

    我找到了一个很简单的方法。使用按钮打开 on click 启动函数的侦听器 openc() ,像这样:

    String fileloc;
    private void openc()
    {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File f = null;
        try 
        {
            f = File.createTempFile("temppic",".jpg",getApplicationContext().getCacheDir());
            if (takePictureIntent.resolveActivity(getPackageManager()) != null)
            {               
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(profile.this, BuildConfig.APPLICATION_ID+".provider",f));
                fileloc = Uri.fromFile(f)+"";
                Log.d("texts", "openc: "+fileloc);
                startActivityForResult(takePictureIntent, 3);
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 3 && resultCode == RESULT_OK) {
            Log.d("texts", "onActivityResult: "+fileloc);
            // fileloc is the uri of the file so do whatever with it
        }
    }
    

    你可以做任何你想做的 uri 位置字符串。例如,我将它发送给图像裁剪器来裁剪图像。

        6
  •  -3
  •   anupam sharma    11 年前

    尝试此代码

    Intent photo= new Intent("android.media.action.IMAGE_CAPTURE");
                        startActivityForResult(photo, CAMERA_PIC_REQUEST);