Android下相机的调用
16lz
2021-12-04
Android下相机的调用
Android下相机的调用分别为调用系统相机和Building a Camera App两种用法;
一、调用系统相机
1.MainActivity.java文件
1 package com.example.takephoto; 2 3 import java.io.File; 4 5 import android.net.Uri; 6 import android.os.Bundle; 7 import android.provider.MediaStore; 8 import android.app.Activity; 9 import android.content.Intent;10 import android.view.Menu;11 import android.view.View;12 import android.view.View.OnClickListener;13 import android.widget.Button;14 import android.media.*;15 16 public class MainActivity extends Activity {17 private Button button;18 19 20 @Override21 protected void onCreate(Bundle savedInstanceState) {22 super.onCreate(savedInstanceState);23 setContentView(R.layout.activity_main);24 25 button=(Button)findViewById(R.id.button1);26 button.setOnClickListener(new View.OnClickListener() {27 28 @Override29 public void onClick(View v) {30 // TODO 自动生成的方法存根31 Intent intent=new Intent();32 intent.setAction("android.media.action.IMAGE_CAPTURE");33 intent.addCategory("android.intent.category.DEFAULT");34 File file=new File("/sdcard/0000image.jpg");35 Uri uri=Uri.fromFile(file);36 intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);37 startActivity(intent);38 }39 });40 41 }42 43 @Override44 public boolean onCreateOptionsMenu(Menu menu) {45 // Inflate the menu; this adds items to the action bar if it is present.46 getMenuInflater().inflate(R.menu.main, menu);47 return true;48 }49 }
2.activity_main.xml布局文件
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="wrap_content" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context=".MainActivity" >10 11 <Button12 android:id="@+id/button1"13 android:layout_width="match_parent"14 android:layout_height="wrap_content"15 android:layout_alignParentLeft="true"16 android:layout_alignParentTop="true"17 android:layout_marginLeft="73dp"18 android:text="拍照" />19 20 RelativeLayout>
3.AndroidManifest.xml文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.takephoto" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="8" 9 android:targetSdkVersion="18" />10 11 <application12 android:allowBackup="true"13 android:icon="@drawable/ic_launcher"14 android:label="@string/app_name"15 android:theme="@style/AppTheme" >16 <activity17 android:name="com.example.takephoto.MainActivity"18 android:label="@string/app_name" >19 <intent-filter>20 <action android:name="android.intent.action.MAIN" />21 22 <category android:name="android.intent.category.LAUNCHER" />23 intent-filter>24 activity>25 application>26 27 manifest>
4.注:因为是调用的系统摄像头进行拍照,系统相机可以自由获取本地文件的存储权限,所以无需在声明权限。
二、Building a Camera App
1.MainActivity.java文件
1 package com.example.takemyphoto; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 8 import android.os.Bundle; 9 import android.app.Activity; 10 import android.content.Context; 11 import android.content.pm.PackageManager; 12 import android.hardware.Camera; 13 import android.hardware.Camera.AutoFocusCallback; 14 import android.hardware.Camera.PictureCallback; 15 import android.util.Log; 16 import android.view.Menu; 17 import android.view.View; 18 import android.widget.Button; 19 import android.widget.FrameLayout; 20 21 public class MainActivity extends Activity { 22 private Camera mCamera; 23 private CreamPrivew mPreview; 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_main); 29 30 // Create an instance of Camera 31 mCamera = getCameraInstance(); 32 33 // Create our Preview view and set it as the content of our activity. 34 mPreview = new CreamPrivew(this, mCamera); 35 FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 36 preview.addView(mPreview); 37 38 // Add a listener to the Capture button 39 Button captureButton = (Button) findViewById(R.id.button_capture); 40 captureButton.setOnClickListener( 41 new View.OnClickListener() { 42 @Override 43 public void onClick(View v) { 44 // get an image from the camera 45 mCamera.autoFocus(new AutoFocusCallback(){ 46 47 @Override 48 public void onAutoFocus(boolean succeed, Camera camera) { 49 // TODO 自动生成的方法存根 50 mCamera.takePicture(null, null, mPicture); 51 } 52 53 }); 54 55 } 56 } 57 ); 58 59 } 60 61 62 /** Check if this device has a camera */ 63 private boolean checkCameraHardware(Context context) { 64 if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ 65 // this device has a camera 66 return true; 67 } else { 68 // no camera on this device 69 return false; 70 } 71 } 72 /** A safe way to get an instance of the Camera object. */ 73 public static Camera getCameraInstance(){ 74 Camera c = null; 75 try { 76 c = Camera.open(); // attempt to get a Camera instance,api9之后支持(1),打开前置摄像机 77 } 78 catch (Exception e){ 79 // Camera is not available (in use or does not exist) 80 } 81 return c; // returns null if camera is unavailable 82 } 83 84 85 86 @Override 87 public boolean onCreateOptionsMenu(Menu menu) { 88 // Inflate the menu; this adds items to the action bar if it is present. 89 getMenuInflater().inflate(R.menu.main, menu); 90 return true; 91 } 92 private PictureCallback mPicture = new PictureCallback() { 93 94 @Override 95 public void onPictureTaken(byte[] data, Camera camera) { 96 97 File pictureFile = new File("/scard/"+System.currentTimeMillis()+".jpg"); 98 99 try {100 FileOutputStream fos = new FileOutputStream(pictureFile);101 fos.write(data);102 fos.close();103 } catch (FileNotFoundException e) {104 Log.d("TAG", "File not found: " + e.getMessage());105 } catch (IOException e) {106 Log.d("TAG", "Error accessing file: " + e.getMessage());107 }108 }109 };110 public void onDestory(){111 if(mCamera!=null){112 mCamera.release();113 mCamera=null;114 115 }116 }117 }
2.CreamPrivew.java文件
1 package com.example.takemyphoto; 2 3 import java.io.IOException; 4 5 import android.content.Context; 6 import android.hardware.Camera; 7 import android.util.Log; 8 import android.view.SurfaceHolder; 9 import android.view.SurfaceView;10 11 public class CreamPrivew extends SurfaceView implements SurfaceHolder.Callback {12 /** A basic Camera preview class */13 private SurfaceHolder mHolder;14 private Camera mCamera;15 16 public CreamPrivew(Context context, Camera camera) {17 super(context);18 mCamera = camera;19 20 // Install a SurfaceHolder.Callback so we get notified when the21 // underlying surface is created and destroyed.22 mHolder = getHolder();23 mHolder.addCallback(this);24 // deprecated setting, but required on Android versions prior to 3.025 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);26 }27 28 public void surfaceCreated(SurfaceHolder holder) {29 // The Surface has been created, now tell the camera where to draw the preview.30 try {31 mCamera.setPreviewDisplay(holder);32 mCamera.startPreview();33 } catch (IOException e) {34 Log.d(VIEW_LOG_TAG, "Error setting camera preview: " + e.getMessage());35 }36 }37 38 public void surfaceDestroyed(SurfaceHolder holder) {39 // empty. Take care of releasing the Camera preview in your activity.40 }41 42 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {43 // If your preview can change or rotate, take care of those events here.44 // Make sure to stop the preview before resizing or reformatting it.45 46 if (mHolder.getSurface() == null){47 // preview surface does not exist48 return;49 }50 51 // stop preview before making changes52 try {53 mCamera.stopPreview();54 } catch (Exception e){55 // ignore: tried to stop a non-existent preview56 }57 58 // set preview size and make any resize, rotate or59 // reformatting changes here60 61 // start preview with new settings62 try {63 mCamera.setPreviewDisplay(mHolder);64 mCamera.startPreview();65 66 } catch (Exception e){67 Log.d(VIEW_LOG_TAG, "Error starting camera preview: " + e.getMessage());68 }69 }70 }
3.activity_main.xml布局文件
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="horizontal" 6 tools:context=".MainActivity" > 7 <FrameLayout 8 android:id="@+id/camera_preview" 9 android:layout_width="fill_parent"10 android:layout_height="fill_parent"11 android:layout_weight="1"12 />13 14 <Button15 android:id="@+id/button_capture"16 android:text="Capture"17 android:layout_width="wrap_content"18 android:layout_height="wrap_content"19 android:layout_gravity="center"20 />21 22 23 LinearLayout>
4.AndroidManifest.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.takemyphoto" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 <uses-permission android:name="android.permission.CAMERA" /> 7 <uses-feature android:name="android.hardware.camera" /> 8 <uses-feature android:name="android.hardware.camera" android:required="false" /> 9 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />10 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />11 12 <uses-sdk13 android:minSdkVersion="8"14 android:targetSdkVersion="18" />15 16 <application17 android:allowBackup="true"18 android:icon="@drawable/ic_launcher"19 android:label="@string/app_name"20 android:theme="@style/AppTheme" >21 <activity22 android:name="com.example.takemyphoto.MainActivity"23 android:label="@string/app_name" 24 android:screenOrientation="landscape">25 <intent-filter>26 <action android:name="android.intent.action.MAIN" />27 28 <category android:name="android.intent.category.LAUNCHER" />29 intent-filter>30 activity>31 application>32 33 manifest>
相关API网址:http://developer.android.com/guide/topics/media/camera.html
转载于:https://www.cnblogs.com/chance88/p/4803155.html
更多相关文章
- NPM 和webpack 的基础使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- android webview 使用js加载json文件失败
- eclipse中使用RecyclerView报错:Error inflating class android.s
- Android中调用天气预报
- [mark]Android(安卓)aapt工具
- Android(安卓)getResources的作用和需要注意点
- android style的使用
- Android(安卓)studio 导入github工程