Android(安卓)聚焦拍照和震动
16lz
2021-01-26
package cn.yws.takephotos;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import android.app.Activity;import android.content.pm.ActivityInfo;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.PictureCallback;import android.hardware.Camera.ShutterCallback;import android.os.Bundle;import android.os.Environment;import android.os.Vibrator;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.Window;import android.view.WindowManager;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity implements SurfaceHolder.Callback{private static String TAG = "MainActivity"; private Camera mCamera; private Button mButton, mButton1, mButton2; private SurfaceView mSurfaceView; private SurfaceHolder holder; private AutoFocusCallback mAutoFocusCallback = new AutoFocusCallback(); private String path = "MyPhoto"; private String path1; private Bitmap bmp; private int cnt = 1; private Calendar c; public native String getISBN(Bitmap bmp); private int flag=5; //震动器 private Vibrator vibrator; @Override protected void onDestroy() { if(null!=vibrator) { vibrator.cancel(); } super.onDestroy(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 隐藏状态栏 */ this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); /* 隐藏标题栏 */ requestWindowFeature(Window.FEATURE_NO_TITLE); /* 设定屏幕显示为横向 */ this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.main); /* SurfaceHolder设定 */ mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); holder = mSurfaceView.getHolder(); holder.addCallback(MainActivity.this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); c = Calendar.getInstance(); vibrator=(Vibrator) this.getSystemService(VIBRATOR_SERVICE); /* Button初始化 */ mButton = (Button) findViewById(R.id.bt_capture); mButton.setText("对焦拍照"); mButton1 = (Button) findViewById(R.id.bt_save); mButton1.setText("保存"); mButton2 = (Button) findViewById(R.id.bt_cancel); mButton2.setText("取消"); /* 拍照Button的事件处理 */ mButton.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View arg0) { Log.i(TAG,"click mButton"); /* 告动对焦后拍照 */ mCamera.autoFocus(mAutoFocusCallback); } }); /* Button的事件处理 */ mButton1.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View arg0) { /* 保存文件 */ Log.i(TAG,"click button1"); if (bmp != null) { /* 检查SDCard是否存在 */ if (!Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { /* SD卡不存在,显示Toast信息 */ Toast.makeText(MainActivity.this, "SD卡不存在!无法保存相片,请插入SD卡。", Toast.LENGTH_LONG) .show(); } else { try { /* 文件不存在就创建 */ File f = new File(Environment.getExternalStorageDirectory(), path); Log.i(TAG,"click button2:" + f.getAbsolutePath()); if (!f.exists()) { f.mkdir(); } SimpleDateFormat dateFormat=new SimpleDateFormat("_yyyy_MM_DD_HH_mm_ss"); String date=dateFormat.format(new Date()); /* 保存相片文件 */ path1 ="camera"+date+".jpg"; File n = new File(f, path1); FileOutputStream bos = new FileOutputStream(n .getAbsolutePath()); /* 图片bmp写入文件,文件转换 */ bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos); /* 调用flush()方法,更新BufferStream */ bos.flush(); /* 结束OutputStream */ bos.close(); Toast.makeText(MainActivity.this,path1 + "保存成功!", Toast.LENGTH_LONG).show(); cnt++; //震动一下 long[] pattern={800,50,400,30};//// OFF/ON/OFF/ON... vibrator.vibrate(pattern, 2);//1不重复,非-1为从pattern的指定下标开始重复 } catch (Exception e) { e.printStackTrace(); } } } mButton.setVisibility(View.VISIBLE); mButton1.setVisibility(View.VISIBLE); mButton2.setVisibility(View.VISIBLE); /* 重新设定Camera */ stopCamera(); initCamera(); } }); /* 放弃Button的事件处理 */ mButton2.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View arg0) { Log.i(TAG,"click mButton2"); mButton.setVisibility(View.VISIBLE); mButton1.setVisibility(View.VISIBLE); mButton2.setVisibility(View.VISIBLE); /* 重新设定Camera */ stopCamera(); initCamera(); } }); } @Override public void surfaceCreated(SurfaceHolder surfaceholder) { try { /* 打开相机, */ mCamera = Camera.open(); mCamera.setPreviewDisplay(holder); } catch (IOException exception) { mCamera.release(); mCamera = null; } } @Override public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w, int h) { /* 相机初始化 */ Log.i(TAG,"init camera"); initCamera(); } @Override public void surfaceDestroyed(SurfaceHolder surfaceholder) { Log.i(TAG,"destoryed camera"); stopCamera(); mCamera.release(); mCamera = null; } /* 拍照的method */ private void takePicture() { if (mCamera != null) { Log.i(TAG,"takePicture"); mCamera.takePicture(shutterCallback, rawCallback, jpegCallback); } } private ShutterCallback shutterCallback = new ShutterCallback() { public void onShutter() { Log.i(TAG, "onShutter"); } }; private PictureCallback rawCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { } }; private PictureCallback jpegCallback = new PictureCallback() { public void onPictureTaken(byte[] _data, Camera _camera) { /* 取得相仞 */ try { /* 设定Button?视性 */ mButton.setVisibility(View.GONE); mButton1.setVisibility(View.VISIBLE); mButton2.setVisibility(View.VISIBLE); /* 取得相仞Bitmap对象 */ bmp = BitmapFactory.decodeByteArray(_data, 0, _data.length); //发送给isbn分析 // String isbn = getISBN(bmp);获得图片解析后的信息 // Log.i(TAG, "isbn:" + flag + isbn); flag--; if(flag>0){ mCamera.autoFocus(mAutoFocusCallback); } } catch (Exception e) { e.printStackTrace(); } } }; /* 告定义class AutoFocusCallback */ public final class AutoFocusCallback implements android.hardware.Camera.AutoFocusCallback { public void onAutoFocus(boolean focused, Camera camera) { /* 对到焦点拍照 */ if (focused) { takePicture(); } } }; /* 相机初始化的method */ private void initCamera() { if (mCamera != null) { try { Camera.Parameters parameters = mCamera.getParameters(); /* * 设定相片大小为1024*768, 格式为JPG */ parameters.setPictureFormat(PixelFormat.JPEG); parameters.setPictureSize(1024, 768); mCamera.setParameters(parameters); /* 开启预览画面 */ mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } } /* 停止相机的method */ private void stopCamera() { if (mCamera != null) { try { /* 停止预览 */ mCamera.stopPreview(); } catch (Exception e) { e.printStackTrace(); } } }}
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context=".MainActivity" > <SurfaceView android:id="@+id/surface_camera" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" > </SurfaceView> <Button android:id="@+id/bt_capture" android:layout_width="64dp" android:layout_height="wrap_content" android:layout_x="360px" android:layout_y="20px" android:text="拍照" /> <Button android:id="@+id/bt_save" android:layout_width="68dp" android:layout_height="wrap_content" android:layout_x="234dp" android:layout_y="110dp" android:text="取消" android:textSize="16px" /> <Button android:id="@+id/bt_cancel" android:layout_width="66dp" android:layout_height="wrap_content" android:layout_x="235dp" android:layout_y="64dp" android:text="保存" android:textSize="16px" /></AbsoluteLayout>
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.yws.takephotos" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.VIBRATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="cn.yws.takephotos.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.CAMERA" /> <user-permission android:name="android.permission.INTERNET" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /></manifest>
更多相关文章
- Jetpack - ViewModel
- Android手势操作(一)
- 调用摄像头拍照并显示
- Android将应用log信息保存文件
- android 拍照和上传
- Android手势操作(三)
- Android(安卓)7.0拍照权限处理
- Android(安卓)搜索框自动提示及其保存历史记录
- Android:使用密码技术安全地保存凭证