android 拍照
16lz
2021-01-23
AndroidManifest.xml
main.xml
strings.xml
CameraActivity.java
CameraPreview.java
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.camera" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /><uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/><uses-permission android:name="android.permission.RESTART_PACKAGES"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".CameraActivity" android:label="@string/app_name" android:screenOrientation="landscape" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>
main.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:baselineAligned="false" android:orientation="horizontal" > <FrameLayout android:id="@+id/camera_preview" android:layout_width="0dip" android:layout_height="fill_parent" android:layout_weight="1" /><LinearLayout android:layout_width="wrap_content" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical" > <Button android:id="@+id/button_capture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:text="@string/Capture" /> <Button android:id="@+id/button_camera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginBottom="5dip" android:text="@string/Camera" /></LinearLayout></LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?><resources> <string name="hello">Hello World, CameraActivity!</string> <string name="app_name">Camera</string> <string name="Capture">拍照</string> <string name="Camera">返回</string> </resources>
CameraActivity.java
package cn.camera;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.PictureCallback;import android.hardware.Camera.ShutterCallback;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.WindowManager;import android.widget.Button;import android.widget.FrameLayout;public class CameraActivity extends Activity {/** Called when the activity is first created. *//** 图片媒体类型 **/ public static final int MEDIA_TYPE_IMAGE = 1; /** 摄像头类的对象 **/ private Camera mCamera; /** 拍照按钮 **/ private Button captureButton; /** 返回摄像头 **/ private Button cameraButton; /** SurfaceView对象 **/ private CameraPreview mPreview; @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); Window window = getWindow();// 得到窗口 this.requestWindowFeature(Window.FEATURE_NO_TITLE);window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏 window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 保持屏幕亮 setContentView(R.layout.main); captureButton = (Button) findViewById(R.id.button_capture); captureButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 启动自动对焦mCamera.autoFocus(new AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {// TODO Auto-generated method stub}});Timer timer = new Timer();timer.schedule(new TimerTask(){@Overridepublic void run() {//拍照函数mCamera.takePicture(mShutter, null, mPicture);}}, 1750);}}); cameraButton = (Button) findViewById(R.id.button_camera); cameraButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 返回按钮(拍完照片之后需要重新启动Camera的Preview) mCamera.startPreview(); } }); // 获取Camera对象的实例 mCamera = getCameraInstance(); // 初始化SurfaceView mPreview = new CameraPreview(this,mCamera); mPreview.setZOrderOnTop(true); FrameLayout preview = (FrameLayout ) findViewById(R.id.camera_preview); // 将SurfaceView添加到FrameLayout中 preview.addView(mPreview); // 设置相机的属性 Camera.Parameters params = mCamera.getParameters(); // JPEG质量设置到最好 params.setJpegQuality(100); // 散光灯模式设置为自动调节 params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); mCamera.setParameters(params); }public static Camera getCameraInstance() { Camera c = null; try { c = Camera.open(); } catch (Exception e) { e.printStackTrace(); } return c; } // 快门的回调函数实现 private ShutterCallback mShutter = new ShutterCallback() { @Override public void onShutter() { } }; // PictureCallback回调函数实现 private PictureCallback mPicture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); if (pictureFile == null) { return; } // 将照片数据data写入指定的文件 try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); //拍照完成后,上传图片// Log.e("upload","length:"+ pictureFile.length());// Upload.uploadPhoto(pictureFile.getPath()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally{ mCamera.startPreview(); //通过Intent传递图片路径 ,拍照完成后,显示图片到屏幕 /* Intent intent = new Intent(); intent.putExtra("picPath", pictureFile.getPath()); intent.setClass(CameraActivity.this, PhotoViewActivity.class); startActivity(intent); */ } } }; /** * 在指定路径创建照片文件 * * @param type * @return */ public static File getOutputMediaFile(int type) { // 指定照片存放的目录,在SD根目录下的一个文件夹中 File mediaStorageDir = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "CameraUseApp"); // 文件夹不存在,则创建该文件夹 if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d("CameraUse", "failed to create directory"); return null; } } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") .format(new Date()); // 创建照片文件 File mediaFile; if (type == MEDIA_TYPE_IMAGE) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "101_20120326195110.jpg"); System.out.println(mediaFile.getPath()); } else { return null; } return mediaFile; } // 释放Camera对象(务必实现) private void releaseCamera() { if (mCamera != null) { mCamera.release(); mCamera = null; } } @Override public boolean onTouchEvent(MotionEvent event) { // 触摸屏幕自动对焦 if (event.getAction() == MotionEvent.ACTION_DOWN) { mCamera.autoFocus(new AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { } }); } return super.onTouchEvent(event); } @Override protected void onPause() { super.onPause(); releaseCamera(); } }
CameraPreview.java
package cn.camera;import java.io.IOException;import android.content.Context;import android.graphics.PixelFormat;import android.hardware.Camera;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {private SurfaceHolder mHolder; private Camera mCamera; public CameraPreview(Context context, Camera camera) {super(context);mCamera = camera; mHolder = this.getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mHolder.setFormat(PixelFormat.TRANSPARENT);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { if (mHolder.getSurface() == null) { System.out.println("mHolder.getSurface() == null"); return; } try { mCamera.stopPreview(); mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (IOException e) { Log.d("surfaceChanged", "Error starting camera preview: " + e.getMessage()); } }@Overridepublic void surfaceCreated(SurfaceHolder holder) { try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { Log.d("surfaceCreated", "Error setting camera preview: " + e.getMessage()); } }@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}
更多相关文章
- Android Studio 3.0以后打包修改文件名方法
- Android 下载文件至SD卡,并用progressBar显示下载进度
- Android 文件IO总结
- Android--取出SDcard卡上指定后缀名的文件
- AndroidManifest.xml文件详解(service)
- Android 实现 选择文件对话框
- Android attrs文件(自定义)属性详解
- Android 使用AsyncHttpClient文件上传与下载