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

我已经创build了一个button的应用程序,并为该button写onClickListener。 我已经尝试了几个示例代码示例,并没有一个工作。 他们都提出Android相机的应用程序,不要拍照。 我想要一些代码,我可以把我的onClickListener,所以当我按下屏幕上的button,一张照片将被采取。

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

看看下面的演示代码。

这里是你的用于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"); } } } 

注意:

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

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

有两种方法拍照:

1 – 使用意图拍照

2 – 使用相机API

我认为你应该使用第二种方法, 这里有两个示例代码 。

你可以使用Magical Take Photo library。

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.如果您需要select设备中的图片,请尝试以下方法:

  magicalTakePhoto.selectedPicture("my_header_name"); 

6.你需要像这样覆盖activity或fragment的方法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()); } 

注意:只有使用该库,您才可以在设备中选取图片,并使用min API 15。

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

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

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

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

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

拍照function

  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" /> 
 Intent takePhoto = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(takePhoto, CAMERA_PIC_REQUEST) 

并设置CAMERA_PIC_REQUEST= 1 or 0