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

Posted

技术标签:

【中文标题】以编程方式在 Android 上使用相机拍照【英文标题】:Taking pictures with camera on Android programmatically 【发布时间】:2013-01-03 12:10:47 【问题描述】:

我创建了一个带有按钮的应用程序并为该按钮编写了 onClickListener。我已经尝试了几个示例代码示例,但都没有工作。他们都调出安卓相机应用程序,不拍照。我想要一些可以放入我的 onClickListener 的代码,这样当我按下屏幕上的按钮时,就会拍摄一张照片。

当我在 android Activity 中按下按钮时,如何让相机拍照?

【问题讨论】:

参考以下链接***.com/questions/13977245/… 【参考方案1】:

看下面的演示代码。

这是您用于 UI 的 XML 文件,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnCapture"
        android:layout_
        android:layout_
        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");
        
    

注意:

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

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

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

【讨论】:

您再次将相机置于预览模式,但不会使其自行拍摄然后返回。你能检查一下吗?谢谢 究竟是哪个按钮?您是指我的布局中指定的按钮,还是相机处于预览模式时的按钮?请澄清。 @MuhammadMaqsoodurRehman:你应该从http://developer.android.com/training/camera/photobasics.html开始 @ranjithstar256: camera.performclick(); 只能打开相机。它不会直接拍照。为此,用户必须进行交互。 在 Nexus 7 中,代码打开相机,我可以按图标拍照,但.... 拍照后冻结(冻结在所拍照片上)。然后您可以选择返回或重新拍照。这两个选项都导致照片未拍摄(或未保存)!请问这个怎么解决?【参考方案2】:

拍照有两种方式:

1 - 使用 Intent 制作照片

2 - 使用相机 API

我认为您应该使用第二种方式,其中两个有一个sample code here。

【讨论】:

我正在使用这个示例。在第二个示例应用程序崩溃中。它说 java.lang.RuntimeException: takePicture failed @AbdulWaheed 我认为您使用的是 android 6.0+,这要求您在访问相机之前在运行时明确请求权限。你的安卓版本是多少? 该示例使用 Camera 类,该类自 API 21(Android 5.0,Lollipop)起已被弃用。但即使有请求的权限,它也会在单击按钮时崩溃。【参考方案3】:

您可以使用 Magical Take Photo 库。

1.尝试在 gradle 中编译

compile 'com.frosquivel:magicaltakephoto:1.0'

2。您需要在 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.像这样实例化类

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

MagicalTakePhoto magicalTakePhoto =  new MagicalTakePhoto(this,ANY_INTEGER_0_TO_4000_FOR_QUALITY);

4.如果需要拍照使用方法

magicalTakePhoto.takePhoto("my_photo_name");

5.如果您需要在设备中选择图片,请尝试以下方法:

magicalTakePhoto.selectedPicture("my_header_name");

6.您需要像这样覆盖活动或片段的 onActivityResult 方法:

@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。

【讨论】:

此库未更新。请建议更新的库【参考方案4】:

获取图像并将其存储在所需的文件夹中

 //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);

        

添加了广播的新图片,否则图片将在图片库中不可见

    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" />

【讨论】:

是的,这是完整的文档,代码为developer.android.com/training/camera/photobasics.html#TaskPath【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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);

【讨论】:

“打开相机的方式”是什么意思。这是否意味着您以某种方式访问​​图片并显示它?还是说您在智能手机上使用/打开“相机应用”?【参考方案7】:
Intent takePhoto = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(takePhoto, CAMERA_PIC_REQUEST)

并设置 CAMERA_PIC_REQUEST= 1 or 0

【讨论】:

以上是关于以编程方式在 Android 上使用相机拍照的主要内容,如果未能解决你的问题,请参考以下文章

当相机在Android中的表面视图上以编程方式截屏

用相机意图拍照以肖像模式android旋转图片

Android拉起系统相机拍照的两种方式及陷阱

Android拉起系统相机拍照的两种方式及陷阱

屏幕关闭时Android相机不会拍照

用相机拍照不起作用Android Studio