首页 文章

以编程方式在Android上用相机拍照

提问于
浏览
52

我用按钮创建了一个应用程序,并为该按钮编写了onClickListener . 我已经尝试了几个示例代码示例,但没有一个有效 . 他们都带来了Android相机应用程序,不拍照 . 我想要一些代码可以放在我的onClickListener中,所以当我按下屏幕上的按钮时,会拍摄一张照片 .

当我在Android活动中按下按钮时,如何让相机拍照?

7 回答

  • -3

    请看下面的演示代码 .

    这是用于UI的XML文件,

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <Button
            android:id="@+id/btnCapture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Camera" />
    
    </LinearLayout>
    

    这是你的Java类文件,

    public class CameraDemoActivity extends Activity {
        int TAKE_PHOTO_CODE = 0;
        public static int count = 0;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            // Here, we are making a folder named picFolder to store
            // pics taken by the camera using this application.
            final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/picFolder/";
            File newdir = new File(dir);
            newdir.mkdirs();
    
            Button capture = (Button) findViewById(R.id.btnCapture);
            capture.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
    
                    // Here, the counter will be incremented each time, and the
                    // picture taken by camera will be stored as 1.jpg,2.jpg
                    // and likewise.
                    count++;
                    String file = dir+count+".jpg";
                    File newfile = new File(file);
                    try {
                        newfile.createNewFile();
                    }
                    catch (IOException e)
                    {
                    }
    
                    Uri outputFileUri = Uri.fromFile(newfile);
    
                    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    
                    startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
                }
            });
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
                Log.d("CameraDemo", "Pic saved");
            }
        }
    }
    

    Note:

    在清单文件中指定以下权限,

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

    拍照有两种方法:

    1 - 使用Intent制作照片

    2 - 使用相机API

    我认为你应该使用第二种方式,其中两种方式有sample code here .

  • 93

    You can use Magical Take Photo library.

    1. try with compile in gradle

    compile 'com.frosquivel:magicaltakephoto:1.0'
    

    2. You need this permission in your manifest.xml

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

    3. instance the class like this

    //“this”是当前的活动参数

    MagicalTakePhoto magicalTakePhoto =  new MagicalTakePhoto(this,ANY_INTEGER_0_TO_4000_FOR_QUALITY);
    

    4. if you need to take picture use the method

    magicalTakePhoto.takePhoto("my_photo_name");
    

    5. if you need to select picture in device, try with the method:

    magicalTakePhoto.selectedPicture("my_header_name");
    

    6. You need to override the method onActivityResult of the activity or fragment like this:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         magicalTakePhoto.resultPhoto(requestCode, resultCode, data);
    
         // example to get photo
         // imageView.setImageBitmap(magicalTakePhoto.getMyPhoto());
    }
    

    注意:只有使用此库,您才能在设备中选择图片,这使用最小的API 15 .

  • 28

    对于那些来到这里寻找使用Android的Camera和Camera2 API以编程方式拍摄照片/照片的方法,请查看Google自己提供的开源示例here .

  • -1

    将图像存储在所需的文件夹中

    //Global Variables
       private static final int CAMERA_IMAGE_REQUEST = 101;
        private String imageName;
    

    拍照功能

    public void captureImage() {
    
                // Creating folders for Image
                String imageFolderPath = Environment.getExternalStorageDirectory().toString()
                        + "/AutoFare";
                File imagesFolder = new File(imageFolderPath);
                imagesFolder.mkdirs();
    
                // Generating file name
                imageName = new Date().toString() + ".png";
    
                // Creating image here
                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imageFolderPath, imageName)));
                startActivityForResult(takePictureIntent,
                        CAMERA_IMAGE_REQUEST);
    
            }
    

    广播新图像否则 pic will not be visible in image gallery

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
                    // TODO Auto-generated method stub
                    super.onActivityResult(requestCode, resultCode, data);
    
                    if (resultCode == Activity.RESULT_OK && requestCode == CAMERA_IMAGE_REQUEST) {
    
                        Toast.makeText(getActivity(), "Success",
                                Toast.LENGTH_SHORT).show();
    
     //Scan new image added
                        MediaScannerConnection.scanFile(getActivity(), new String[]{new File(Environment.getExternalStorageDirectory()
                                + "/AutoFare/" + imageName).getPath()}, new String[]{"image/png"}, null);
    
    
     // Work in few phones
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    
                            getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(Environment.getExternalStorageDirectory()
                                    + "/AutoFare/" + imageName)));
    
                        } else {
                            getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(Environment.getExternalStorageDirectory()
                                    + "/AutoFare/" + imageName)));
                        }
                    } else {
                        Toast.makeText(getActivity(), "Take Picture Failed or canceled",
                                Toast.LENGTH_SHORT).show();
                    }
                }
    

    权限

    <uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android.hardware.camera" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  • 4

    以下是打开相机的简单方法:

    private void startCamera() {
    
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI.getPath());
        startActivityForResult(intent, 1);
    }
    
  • 2
    Intent takePhoto = new Intent("android.media.action.IMAGE_CAPTURE");
    startActivityForResult(takePhoto, CAMERA_PIC_REQUEST)
    

    并设置 CAMERA_PIC_REQUEST= 1 or 0

相关问题