Android手机拍照功能源码
- 格式:doc
- 大小:135.50 KB
- 文档页数:4
android中打开相机、打开相册进⾏图⽚的获取⽰例这⾥介绍在Android中实现相机调取、拍照⽚、获取照⽚、存储新路径等已经打开相册、选择照⽚等功能⾸先看⼀下界⾯,很简单配置读取内存卡和调⽤照相头的功能<!-- 使⽤⽹络权限 --><uses-permission android:name="android.permission.INTERNET"/><!-- 写sd卡的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 读sd卡权限 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />下⾯是代码的主题public class TakePhotos extends Activity implementsandroid.view.View.OnClickListener {Button takePhoto;Bitmap photo;String picPath;Button capture;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(yout.activity_photo);takePhoto = (Button) findViewById(R.id.button1);capture = (Button) findViewById(R.id.capture);takePhoto.setOnClickListener(this);capture.setOnClickListener(this);}@Overridepublic void onClick(View viewid) {switch (viewid.getId()) {case R.id.button1: {// 打开相机String state = Environment.getExternalStorageState();// 获取内存卡可⽤状态if (state.equals(Environment.MEDIA_MOUNTED)) {// 内存卡状态可⽤Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");startActivityForResult(intent, 1);} else {// 不可⽤Toast.makeText(TakePhotos.this, "内存不可⽤", Toast.LENGTH_LONG).show();}break;}case R.id.capture: {// 打开相册// 打开本地相册Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// 设定结果返回startActivityForResult(i, 2);break;}default:break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (data != null) {switch (requestCode) {// 两种⽅式获取拍好的图⽚if (data.getData() != null || data.getExtras() != null) { // 防⽌没有返回结果Uri uri = data.getData();if (uri != null) {this.photo = BitmapFactory.decodeFile(uri.getPath()); // 拿到图⽚}if (photo == null) {Bundle bundle = data.getExtras();if (bundle != null) {photo = (Bitmap) bundle.get("data");FileOutputStream fileOutputStream = null;try {// 获取 SD 卡根⽬录⽣成图⽚并String saveDir = Environment.getExternalStorageDirectory()+ "/dhj_Photos";// 新建⽬录File dir = new File(saveDir);if (!dir.exists())dir.mkdir();// ⽣成⽂件名SimpleDateFormat t = new SimpleDateFormat( "yyyyMMddssSSS");String filename = "MT" + (t.format(new Date()))+ ".jpg";// 新建⽂件File file = new File(saveDir, filename);// 打开⽂件输出流fileOutputStream = new FileOutputStream(file);// ⽣成图⽚⽂件press(pressFormat.JPEG,100, fileOutputStream);// 相⽚的完整路径this.picPath = file.getPath();ImageView imageView = (ImageView) findViewById(R.id.imageView1); imageView.setImageBitmap(this.photo);} catch (Exception e) {e.printStackTrace();} finally {if (fileOutputStream != null) {try {fileOutputStream.close();} catch (Exception e) {e.printStackTrace();}}}Toast.makeText(getApplicationContext(), "获取到了",Toast.LENGTH_SHORT).show();} else {Toast.makeText(getApplicationContext(), "找不到图⽚",Toast.LENGTH_SHORT).show();}}}break;case 2: {//打开相册并选择照⽚,这个⽅式选择单张// 获取返回的数据,这⾥是android⾃定义的Uri地址Uri selectedImage = data.getData();String[] filePathColumn = { MediaStore.Images.Media.DATA };// 获取选择照⽚的数据视图Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);cursor.moveToFirst();// 从数据视图中获取已选择图⽚的路径int columnIndex = cursor.getColumnIndex(filePathColumn[0]);String picturePath = cursor.getString(columnIndex);cursor.close();// 将图⽚显⽰到界⾯上ImageView imageView = (ImageView) findViewById(R.id.imageView1); imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); break;}default:}}}}注释的很详细,⾃⼰分析吧。
android摄像头拍照编程以下是测试通过的一个android摄像头拍照编程例子,步骤如下:1.编写拍照类CameraActivitypublic class CameraActivity extends Activity {private CameraView cv;// 准备一个相机对象private Camera mCamera = null;// 准备一个Bitmap对象private Bitmap mBitmap = null;// 准备一个保存图片的PictureCallback对象public Camera.PictureCallback pictureCallback = newCamera.PictureCallback() {public void onPictureTaken(byte[] data, Camera camera) {Log.i("yao", "onPictureTaken");Toast.makeText(getApplicationContext(), "正在保存……",Toast.LENGTH_LONG).show();// 用BitmapFactory.decodeByteArray()方法可以把相机传回的裸数据转换成Bitmap对象mBitmap= BitmapFactory.decodeByteArray(data, 0, data.length);// 接下来的工作就是把Bitmap保存成一个存储卡中的文件File file = new File("/mnt/sdcard/pics/"+ new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".jpg");try {file.createNewFile();BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));press(pressFormat.PNG, 100, os);os.flush();os.close();Toast.makeText(getApplicationContext(), "图片保存完毕,在存储卡的pics目录",Toast.LENGTH_LONG).show();} catch (IOException e) {e.printStackTrace();}}};// Activity的创建方法@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 窗口去掉标题requestWindowFeature(Window.FEATURE_NO_TITLE);// 窗口设置为全屏getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);// 设置窗口为半透明getWindow().setFormat(PixelFormat.TRANSLUCENT);// 提供一个框架布局FrameLayout fl = new FrameLayout(this);// 创建一个照相预览用的SurfaceView子类,并放在帧布局的底层cv = new CameraView(this);fl.addView(cv);// 创建一个文本框添加在帧布局中,我们可以看到,文字自动出现在了SurfaceView的前面,由此你可以在预览窗口做出各种特殊效果TextView tv = new TextView(this);tv.setText("请按\"相机\"按钮拍摄");fl.addView(tv);// 设置Activity的根内容视图setContentView(fl);}// 相机按键按下的事件处理方法public boolean onKeyDown(int keyCode, KeyEvent event) {Log.i("yao", "MainActivity.onKeyDown");if (keyCode == KeyEvent.KEYCODE_CAMERA) {if (mCamera != null) {Log.i("yao", "mCamera.takePicture");// 当按下相机按钮时,执行相机对象的takePicture()方法,该方法有三个回调对象做入参,不需要的时候可以设nullmCamera.takePicture(null, null, pictureCallback);}}return cv.onKeyDown(keyCode, event);}class CameraView extends SurfaceView implements SurfaceHolder.Callback {private SurfaceHolder holder = null;// 构造函数public CameraView(Context context) {super(context);Log.i("yao", "CameraView");// 操作surface的holderholder = this.getHolder();// 创建SurfaceHolder.Callback对象holder.addCallback(this);// 设置Push缓冲类型,说明surface数据由其他来源提供,而不是用自己的Canvas来绘图,在这里是由摄像头来提供数据holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// 停止预览mCamera.stopPreview();// 释放相机资源并置空mCamera.release();mCamera = null;}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 当预览视图创建的时候开启相机mCamera = Camera.open();try {// 设置预览mCamera.setPreviewDisplay(holder);} catch (IOException e) {// 释放相机资源并置空mCamera.release();mCamera = null;}}// 当surface视图数据发生变化时,处理预览信息@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// 获得相机参数对象Camera.Parameters parameters = mCamera.getParameters();// 设置格式parameters.setPictureFormat(PixelFormat.JPEG);// 设置预览大小,这里我的测试机是Milsstone所以设置的是854x480parameters.setPreviewSize(854, 480);// 设置自动对焦parameters.setFocusMode("auto");// 设置图片保存时的分辨率大小parameters.setPictureSize(2592, 1456);// 给相机对象设置刚才设定的参数mCamera.setParameters(parameters);// 开始预览mCamera.startPreview();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {this.getMenuInflater().inflate(R.menu.camera_menu, menu);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {if (item.getItemId() == R.id.takePhotoItem) {if (mCamera != null) {Log.i("yao", "mCamera.takePicture");// 当按下相机按钮时,执行相机对象的takePicture()方法,该方法有三个回调对象做入参,不需要的时候可以设nullmCamera.takePicture(null, null, pictureCallback);}} else if (item.getItemId() == R.id.queryPhotoItem) {Intent intent = new Intent(this, BrowserPhotoActivity.class);this.startActivity(intent);} else if (item.getItemId() == R.id.stopPhotoItem) {// 停止预览mCamera.stopPreview();// 释放相机资源并置空mCamera.release();mCamera = null;}return super.onOptionsItemSelected(item);}}2.编写相应的菜单文件res/menu/camera_menu.xml当用户单击menu按钮时,会弹出操作菜单,有拍照、停止预览、浏览相片等功能<?xml version="1.0"encoding="utf-8"?><menu xmlns:android="/apk/res/android">android:id="@+id/takePhotoItem"android:title="拍照"></item><itemandroid:id="@+id/stopPhotoItem"android:title="停止预览"></item><itemandroid:id="@+id/queryPhotoItem"android:title="浏览相片"></item></menu>3.编写浏览相片的布局文件res/layout/browserphoto.xml<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><GridViewandroid:id="@+id/photoGridView"android:layout_width="match_parent"android:layout_height="wrap_content"android:numColumns="3"></GridView></LinearLayout>4.编写浏览相片类BrowserPhotoActivity.javapublic class BrowserPhotoActivity extends Activity implements OnItemClickListener{private GridView photoGridView;private String picBaseDir = "/mnt/sdcard/pics/";private String[] pics; //存放所有图片文件public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(yout.browserphoto);loadView();}private void loadView(){photoGridView = (GridView)this.findViewById(R.id.photoGridView);File file = new File(picBaseDir);pics = file.list();photoGridView.setAdapter(new ImageAdapter());photoGridView.setOnItemClickListener(this);}class ImageAdapter extends BaseAdapter{@Overridepublic int getCount() {// TODO Auto-generated method stubreturn pics.length;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {String filePath = picBaseDir+pics[position];Bitmap bitmap = BitmapFactory.decodeFile(filePath);bitmap = ImageUtil.zoomBitmap(bitmap, bitmap.getWidth()/2, bitmap.getHeight()/2);ImageView imageView = new ImageView(BrowserPhotoActivity.this);imageView.setImageBitmap(bitmap);imageView.setLayoutParams(newyoutParams(80,60));return imageView;}}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// TODO Auto-generated method stubAlertDialog.Builder dialog = new AlertDialog.Builder(this);dialog.setTitle("查看图片");View dialogView =LayoutInflater.from(this).inflate(yout.photodialog, null);String filePath = picBaseDir+pics[position];Bitmap bitmap = BitmapFactory.decodeFile(filePath);bitmap = ImageUtil.zoomBitmap(bitmap,bitmap.getWidth()*2,bitmap.getHeight()*2);ImageView imageView =(ImageView)dialogView.findViewById(R.id.photoImageView);imageView.setImageBitmap(bitmap);dialog.setView(dialogView);dialog.setPositiveButton("返回", null);dialog.show();}}5.编写浏览单张相片对话框布局文件res/layout/photodialog.xml<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ImageViewandroid:id="@+id/photoImageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/bg"/></LinearLayout>。
Android使⽤系统相机进⾏拍照的步骤前⾔我们在⽇常的开发中有时候会遇到需要⽤到相机的需求,⽽相机也是很常⽤的东西,例如扫⼆维码啊拍照上传啊等等。
这⾥我不讲像qq那样⾃定义很强的拍照功能(事实上我也不会),讲个最简单的调⽤系统相机拍照并储存调⽤系统相机步骤这⾥我通过⼀个简单的例⼦来讲这个内容。
我⾃⼰写了⼀个demo,布局很简单:<Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="4dp"android:text="take phone"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.281"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="29dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/button"app:srcCompat="@mipmap/ic_launcher_round" />就是⼀个按钮点击弹起相机,然后⼀个imageView显⽰拍到的照⽚。
【Android】AndroidCamera实时数据采集及通过MediaCodec硬编码编。
吐槽: 其实常⽤流程都差不多,但是有时候还是会忘记某⼀步的详细⽤法,但是各位朋友请注意,官⽅已经不推荐Camera类的使⽤(现在是android.hardware.camera2),但⽆奈公司项⽬之前是使⽤Camera类实现的,并且Camera2貌似是基于API 21以上的,这Android 7的风声都放出来了,可是6.0现在出了3个多⽉了市场占有率也才貌似3%不到,什么时候才能有个标准化和统⼀规范,作为⼀名Android开发者实属不易啊,叹⽓~Android实现摄像头实时数据采集及通过硬编码编码数据的流程:/** 编码器获取数据,编码,编码后的数据的处理等⼤致流程如下:*//* 1.获取原始帧 */@OverrideonPreviewFrame( byte[] onPreviewData, Camera camera) {/* 在此可以对onPreviewData进⾏Rotate或者Scale* 也可以转换yuv的格式,例如yuv420P(YV12)或者yuv420SP(NV21/NV12)* 相关开源类库可以使⽤libyuv/ffmpeg等*/getRawFrame(onPreviewData)/* 然后将onPreviewData加⼊Camera回调*/addCallbackBuffer(onPreviewData);}private void getRawFrame( byte[] rawFrame ) { encodFrame(rawFrame); }/* 2.进⾏编码 */private byte[] encodFrame(byte[] inputData) { return encodedData; }/* 3.取得编码后的数据便可进⾏相应的操作,可以保存为本地⽂件,也可进⾏推流 */Operation ? Send(byte[] sendData) : Save(byte[] saveData)上述代码onPreviewFrame为Camera类的接⼝,使⽤Camera前需要进⾏SurfaceView及SurfaceHolder的初始化及相应interface的实现:// init the preview surfaceprivate void initview() {SurfaceView surfaceView = (SurfaceView) findViewById(R.id.record_surface);SurfaceHolder surfaceHolder = surfaceView.getHolder();surfaceHolder.addCallback(this);surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {openCamera(holder); // 开启相机}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {releaseCamera(); // 在surfaceDestroyed的时候记得releaseCamera}private void openCamera(SurfaceHolder holder) {releaseCamera();try {camera = getCamera(Camera.CameraInfo.CAMERA_FACING_BACK); // 根据需求选择前/后置摄像头} catch (Exception e) {camera = null;if (AppContext.isDebugMode) {e.printStackTrace();}}if(mCamera != null){try {mCamera.setPreviewCallback(this);mCamera.setDisplayOrientation(90); // 此⽅法为官⽅提供的旋转显⽰部分的⽅法,并不会影响onPreviewFrame⽅法中的原始数据;if(parameters == null){parameters = mCamera.getParameters();}parameters.setPreviewFormat(ImageFormat.NV21); // 常⽤格式:NV21 / YV12parameters.setPreviewSize(width, height); // 还可以设置很多相机的参数,但是建议先遍历当前相机是否⽀持该配置,不然可能会导致出错;mCamera.setParameters(parameters);mCamera.setPreviewDisplay(holder);mCamera.startPreview();} catch (IOException e) {e.printStackTrace();}}}@TargetApi(9)private Camera getCamera(int cameraType) {Camera camera = null;try {camera = Camera.open(cameraType);} catch (Exception e) {e.printStackTrace();}return camera; // returns null if camera is unavailable}private synchronized void releaseCamera() {if (camera != null) {try {camera.setPreviewCallback(null);} catch (Exception e) {e.printStackTrace();}try {camera.stopPreview();} catch (Exception e) {e.printStackTrace();}try {camera.release();} catch (Exception e) {e.printStackTrace();}camera = null;}}MediaCodec硬编码实现部分:此处推荐参考SRS开源项⽬中的实现⽅法:// video device.private Camera camera;private MediaCodec vencoder;private MediaCodecInfo vmci;private MediaCodec.BufferInfo vebi;private byte[] vbuffer;// video camera settings.private Camera.Size vsize;private int vcolor;private int vbitrate_kbps = 300;private final static int VFPS = 20;private final static int VGOP = 5;private final static int VWIDTH = 640;private final static int VHEIGHT = 480;/* ⾸先需要初始化MediaCodec的配置 */private void initMediaCodec() {// choose the right vencoder, perfer qcom then google.vcolor = chooseVideoEncoder();// vencoder yuv to 264 es stream.// requires sdk level 16+, Android 4.1, 4.1.1, the JELLY_BEANtry {vencoder = MediaCodec.createByCodecName(vmci.getName());} catch (IOException e) {Log.e(TAG, "create vencoder failed.");e.printStackTrace();return;}vebi = new MediaCodec.BufferInfo();// setup the vencoder.// @see https:///reference/android/media/MediaCodec.htmlMediaFormat vformat = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, vsize.width, vsize.height); vformat.setInteger(MediaFormat.KEY_COLOR_FORMAT, vcolor);vformat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);vformat.setInteger(MediaFormat.KEY_BIT_RATE, 1000 * vbitrate_kbps);vformat.setInteger(MediaFormat.KEY_FRAME_RATE, VFPS);vformat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, VGOP);Log.i(TAG, String.format("vencoder %s, color=%d, bitrate=%d, fps=%d, gop=%d, size=%dx%d",vmci.getName(), vcolor, vbitrate_kbps, VFPS, VGOP, vsize.width, vsize.height));// the following error can be ignored:// 1. the storeMetaDataInBuffers error:// [OMX.qcom.video.encoder.avc] storeMetaDataInBuffers (output) failed w/ err -2147483648// @see /mediacodec/#q12vencoder.configure(vformat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);vencoder.start();}// for the vbuffer for YV12(android YUV), @see below://https:///reference/android/hardware/Camera.Parameters.html#setPreviewFormat(int)//https:///reference/android/graphics/ImageFormat.html#YV12private int getYuvBuffer(int width, int height) {// stride = ALIGN(width, 16)int stride = (int) Math.ceil(width / 16.0) * 16;// y_size = stride * heightint y_size = stride * height;// c_stride = ALIGN(stride/2, 16)int c_stride = (int) Math.ceil(width / 32.0) * 16;// c_size = c_stride * height/2int c_size = c_stride * height / 2;// size = y_size + c_size * 2return y_size + c_size * 2;}// choose the video encoder by name.private MediaCodecInfo chooseVideoEncoder(String name, MediaCodecInfo def) {int nbCodecs = MediaCodecList.getCodecCount();for (int i = 0; i < nbCodecs; i++) {MediaCodecInfo mci = MediaCodecList.getCodecInfoAt(i);if (!mci.isEncoder()) {continue;}String[] types = mci.getSupportedTypes();for (int j = 0; j < types.length; j++) {if (types[j].equalsIgnoreCase(VCODEC)) {//Log.i(TAG, String.format("vencoder %s types: %s", mci.getName(), types[j]));if (name == null) {return mci;}if (mci.getName().contains(name)) {return mci;}}}}return def;}// choose the right supported color format. @see below://https:///reference/android/media/MediaCodecInfo.html//https:///reference/android/media/MediaCodecInfo.CodecCapabilities.htmlprivate int chooseVideoEncoder() {// choose the encoder "video/avc":// 1. select one when type matched.// 2. perfer google avc.// 3. perfer qcom avc.vmci = chooseVideoEncoder(null, null);//vmci = chooseVideoEncoder("google", vmci);//vmci = chooseVideoEncoder("qcom", vmci);int matchedColorFormat = 0;MediaCodecInfo.CodecCapabilities cc = vmci.getCapabilitiesForType(VCODEC);for (int i = 0; i < cc.colorFormats.length; i++) {int cf = cc.colorFormats[i];Log.i(TAG, String.format("vencoder %s supports color fomart 0x%x(%d)", vmci.getName(), cf, cf));// choose YUV for h.264, prefer the bigger one.// corresponding to the color space transform in onPreviewFrameif ((cf >= cc.COLOR_FormatYUV420Planar && cf <= cc.COLOR_FormatYUV420SemiPlanar)) {if (cf > matchedColorFormat) {matchedColorFormat = cf;}}}for (int i = 0; i < cc.profileLevels.length; i++) {MediaCodecInfo.CodecProfileLevel pl = cc.profileLevels[i];Log.i(TAG, String.format("vencoder %s support profile %d, level %d", vmci.getName(), pl.profile, pl.level));}Log.i(TAG, String.format("vencoder %s choose color format 0x%x(%d)", vmci.getName(), matchedColorFormat, matchedColorFormat));return matchedColorFormat;} 上述代码为SRS的部分实现,仅作参考。
现在的移动智能设备已经具备了强大的图像识别和人脸识别功能,这为开发者们带来了更多的可能性。
特别是在Android平台上,利用Android的图像识别和人脸识别功能进行开发已经变得更加简单和便捷。
本文将探讨如何充分利用Android的这些功能进行应用开发。
一、图像识别功能的开发首先,我们来讨论如何使用Android的图像识别功能进行开发。
Android提供了一系列的API和工具,可以帮助我们高效地实现图像识别功能。
下面是一些关键的步骤和技术。
1. 资源准备在进行图像识别之前,我们首先需要收集大量的图像数据作为训练集。
这些图像数据可以分为不同的类别,如动物、植物、物体等。
我们可以通过网络爬取和用户上传等方式来获取这些数据。
同时,还需要对这些数据进行预处理,如图像剪裁、大小调整、灰度化等。
2. 特征提取特征提取是图像识别的关键环节,它可以将图像的关键特征提取出来,从而进行分类和识别。
在Android中,我们可以使用OpenCV等开源库来实现特征提取的功能。
这些库提供了各种图像处理和计算机视觉算法,如边缘检测、颜色直方图等。
我们可以根据具体的需求选择适合的算法进行特征提取。
3. 模型训练与优化在进行图像识别之前,我们需要先训练一个模型。
模型是由大量的样本数据训练得到的,它可以根据输入的图像数据进行分类和识别。
在Android中,我们可以使用机器学习框架TensorFlow Lite来进行模型的训练和优化。
TensorFlow Lite提供了简洁高效的API和工具,可以帮助我们快速搭建和优化模型。
4. 应用集成当模型训练完成后,我们就可以将其应用到Android应用程序中了。
Android提供了一系列的图像处理和识别API,如Camera API、ImageReader API等,可以帮助我们获取摄像头数据、读取图像等。
我们可以将这些API与我们训练好的模型进行集成,从而实现图像识别的功能。
二、人脸识别功能的开发除了图像识别功能,Android平台还为开发者提供了强大的人脸识别功能。
flutter camera 前后拍照用法Flutter是一种流行的移动开发框架,可用于构建跨平台应用程序。
在Flutter中,使用相机功能需要借助第三方插件,例如flutter_camera。
下面介绍如何使用flutter_camera插件实现前后拍照功能。
一、安装flutter_camera插件在Flutter项目中,打开终端并执行以下命令安装flutter_camera插件:```shellflutterpubaddflutter_camera```二、导入相关库在需要使用相机功能的文件或文件中导入所需的库:```dartimport'package:flutter/material.dart';import'package:flutter_camera/flutter_camera.dart';```三、设置相机权限在Android平台上,需要在AndroidManifest.xml中添加相机权限,并在代码中请求相机权限。
在iOS平台上,需要在Info.plist文件中添加相应的权限。
四、拍照功能实现1.显示相机镜头使用FlutterCamera类中的showCamera方法显示相机镜头。
可以在方法中添加回调函数以处理拍照结果。
示例代码如下:```dartFuture<void>takePhoto()async{CameraRequestcameraRequest=CameraRequest.takePhoto();awaitcameraRequest.takePhoto(CameraOption.centerCrop,(res ult){if(result.status==ResultStatus.success){photo=result.data;//保存拍照结果}else{//处理拍照失败的情况}});}```2.后置摄像头切换使用FlutterCamera类中的switchCamera方法切换到后置摄像头。
AndroidCamera详解相关的类1. android.hardware.camera22. Camera3. SurfaceView---这个类⽤于向⽤户呈现实时相机预览。
4. MediaRecorder---这个类⽤于从摄像机录制视频。
5. Intent---MediaStore.ACTION_IMAGE_CAPTURE或MediaStore.ACTION_VIDEO_CAPTURE可⽤于捕获图像或视频,⽽⽆需直接使⽤Camera对象。
清单声明在使⽤Camera API开始开发应⽤程序之前,应确保您的清单具有适当的声明,以允许使⽤相机硬件和其他相关功能。
相机权限 - 您的应⽤程序必须请求使⽤设备相机的权限。
<uses-permission android:name="android.permission.CAMERA" />注意:如果您通过调⽤现有的摄像头应⽤程序来使⽤摄像头,则应⽤程序不需要请求此权限。
相机功能 - 您的应⽤程序还必须声明使⽤相机功能,例如:<uses-feature android:name="android.hardware.camera" />存储权限 - 如果应⽤程序将图像或视频保存到设备的外部存储设备(SD卡),则还必须在清单中指定此选项。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />⾳频录制权限 - 对于使⽤视频捕获录制⾳频,应⽤程序必须请求获取⾳频捕获权限。
<uses-permission android:name="android.permission.RECORD_AUDIO" />创建⾃定义摄像头为应⽤程序创建⾃定义摄像头界⾯的⼀般步骤如下:1. 检测和访问摄像机 - 创建代码以检查摄像机是否存在并请求访问。
Android开发中的摄像头预览和视频录制技术在当今智能手机普及的时代,摄像头已成为手机功能的重要组成部分之一。
同时,随着Android操作系统的不断发展,摄像头的应用也越来越广泛。
本文将讨论Android开发中的摄像头预览和视频录制技术。
一、摄像头预览技术在Android开发中,摄像头预览技术是使用摄像头功能的基础。
通过对摄像头进行预览,用户可以在手机屏幕上看到实时的图像。
这项技术在相机应用、视频聊天或直播等场景中被广泛使用。
1. SurfaceView与TextureView在Android中,实现摄像头预览的常用控件有SurfaceView和TextureView。
SurfaceView比较常见,也是比较成熟的预览控件。
通过SurfaceHolder类可以将摄像头预览数据与SurfaceView进行绑定,实现预览功能。
TextureView则是在API 14级引入的,相较于SurfaceView,它的灵活性更高,可以在布局文件中直接引用,并可以方便地与其他控件进行组合使用。
2. 摄像头参数设置在进行摄像头预览时,我们还可以对摄像头的参数进行设置,以达到更好的效果。
例如,可以设置预览的分辨率、对焦模式、曝光度、白平衡等参数。
通过调整这些参数,可以使得摄像头预览更加清晰、高质量。
二、视频录制技术除了摄像头预览技术外,Android开发中还有视频录制技术,它可以将摄像头捕捉到的图像数据保存为视频文件,为用户提供更多的功能和体验。
1. MediaRecorder类在Android中,使用MediaRecorder类可以简单地实现视频录制功能。
通过设置一些参数,如视频的格式、分辨率、码率等,我们可以控制视频录制的质量和大小。
同时,还可以设置音频的相关参数,并与视频数据进行同步,实现完整的视频录制。
2. 相机数据处理在视频录制过程中,我们还可以对摄像头捕捉到的图像数据进行处理,以实现一些特殊的效果。
例如,可以对图像进行滤镜处理、美颜操作、动态贴纸等。
基于Android 的多功能手机相册设计与实现摘要:该文通过介绍设计一个基于android的多功能手机相册软件,阐述了android camera、图片编辑、微博客户端开发等相关知识,尤其对使用camera api直接控制相机硬件及新浪微博分享作了详细的介绍,同时将设计过程中所用到的主要方法及控件进行了详细说明。
具有较强的实用性。
关键词:android camera;新浪微博; api中图分类号:tp311 文献标识码:a 文章编号:1009-3044(2013)15-3614-03android 平台以其强大的功能和友好的用户界面,在几大主流平台的竞争中取得了巨大的胜利和飞速的发展,在移动操作系统市场的份额中所占的比例也越来越大。
3g时代的出现,也使更多人愿意随时随地分享自己的信息。
多功能手机相册软件将手机拍照、照片的编辑与美化、微博分享等功能结合在一起,给用户带来了一站式的体验,也改变了用户的生活方式。
1 android简介android是一种以linux为基础的开放源代码操作系统,主要使用于便携设备。
由google和开放手持设备联盟开发与领导。
1.1 android架构android的系统架构和其它操作系统一样,采用了分层的架构。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
android系统架构图如图1所示[1]。
1.2 android平台的关键组件android应用组件是应用程序的必要构建模块,每个组件都存在于自己的实体并且扮演着唯一的构建模块,可以用来定义android 应用的完整行为。
android有四种不同类型的应用组件,每个组件充当不同的角色,并且有唯一的用来定义组件如何创建、如何消亡的不同的生命周期[2]。
这四种应用组件是:1)activities:一个activity代表一个单独的带有用户接口的屏幕。
并且一个应用可以启动另一个完全不同的应用中的activity。
Android的Camera系统分析一、Camera构架分析Android 的Camera包含取景(preview)和拍摄照片(take picture)的功能。
目前Android 发布版的Camera程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。
Android中Camera模块同样遵循Andorid的框架,如下图所示Camera ArchitectureCamera模块主要包含了libandroid_runtime.so、libui.so和libcameraservice.so等几个库文件,它们之间的调用关系如下所示:在Camera模块的各个库中,libui.so位于核心的位置,它对上层的提供的接口主要是Camera 类。
libcameraservice.so是Camera的server程序,它通过继承libui.so中的类实现server的功能,并且与libui.so中的另外一部分内容通过进程间通讯(即Binder机制)的方式进行通讯。
libandroid_runtime.so和libui.so两个库是公用的,其中除了Camera还有其他方面的功能。
整个Camera在运行的时候,可以大致上分成Client和Server两个部分,它们分别在两个进程中运行,它们之间使用Binder机制实现进程间通讯。
这样在client 调用接口,功能则在server中实现,但是在client中调用就好像直接调用server中的功能,进程间通讯的部分对上层程序不可见。
从框架结构上来看,源码中ICameraService.h、ICameraClient.h和ICamera.h三个类定义了MeidaPlayer的接口和架构,ICameraService.cpp和Camera.cpp两个文件则用于Camera 架构的实现,Camera的具体功能在下层调用硬件相关的接口来实现。
Android调用手机拍照以及从相册选择照片/*用来标识请求照相功能的activity*/private static final int CAMERA_WITH_DATA = 3023;/*用来标识请求gallery的activity*/private static final int PHOTO_PICKED_WITH_DATA = 3021;/*拍照的照片存储位置*/private static final File PHOTO_DIR = newFile(Environment.getExternalStorageDirectory() + "/DCIM/Camera");private File mCurrentPhotoFile;//照相机拍照得到的图片private void doPickPhotoAction() {Context context = EditContact.this;// Wrap our context to inflate list items using correct themefinal Context dialogContext = new ContextThemeWrapper(context,android.R.style.Theme_Light);String cancel="返回";String[] choices;choices = new String[2];choices[0] = getString(R.string.take_photo); //拍照choices[1] = getString(R.string.pick_photo); //从相册中选择final ListAdapter adapter = new ArrayAdapter<String>(dialogContext,yout.simple_list_item_1, choices);final AlertDialog.Builder builder = new AlertDialog.Builder(dialogContext);builder.setTitle(R.string.attachToContact);builder.setSingleChoiceItems(adapter, -1,new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {dialog.dismiss();switch (which) {case 0:{Stringstatus=Environment.getExternalStorageState();if(status.equals(Environment.MEDIA_MOUNTED)){//判断是否有SD卡doTakePhoto();// 用户点击了从照相机获取}else{showToast("没有SD卡");}break;}case 1:doPickPhotoFromGallery();// 从相册中去获取break;}}});builder.setNegativeButton(cancel, newDialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}}/*** 拍照获取图片**/protected void doTakePhoto() {try {// Launch camera to take photo for selected contactPHOTO_DIR.mkdirs();// 创建照片的存储目录mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName());// 给新照的照片文件命名final Intent intent = getTakePickIntent(mCurrentPhotoFile);startActivityForResult(intent, CAMERA_WITH_DATA);} catch (ActivityNotFoundException e) {Toast.makeText(this, R.string.photoPickerNotFoundText,Toast.LENGTH_LONG).show();}}public static Intent getTakePickIntent(File f) {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));return intent;}/*** 用当前时间给取得的图片命名**/private String getPhotoFileName() {Date date = new Date(System.currentTimeMillis());SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyy-MM-dd HH:mm:ss");return dateFormat.format(date) + ".jpg";}// 请求Gallery程序protected void doPickPhotoFromGallery() {try {// Launch picker to choose photo for selected contactfinal Intent intent = getPhotoPickIntent();startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);} catch (ActivityNotFoundException e) {Toast.makeText(this, R.string.photoPickerNotFoundText1,Toast.LENGTH_LONG).show();}}// 封装请求Gallery的intentpublic static Intent getPhotoPickIntent() {Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);intent.setType("image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 80);intent.putExtra("outputY", 80);intent.putExtra("return-data", true);return intent;}// 因为调用了Camera和Gally所以要判断他们各自的返回情况,他们启动时是这样的startActivityForResultprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK)return;switch (requestCode) {case PHOTO_PICKED_WITH_DATA: {// 调用Gallery返回的final Bitmap photo = data.getParcelableExtra("data");// 下面就是显示照片了System.out.println(photo);//缓存用户选择的图片img = getBitmapByte(photo);mEditor.setPhotoBitmap(photo);System.out.println("set new photo");break;}case CAMERA_WITH_DATA: {// 照相机程序返回的,再次调用图片剪辑程序去修剪图片doCropPhoto(mCurrentPhotoFile);break;}}}protected void doCropPhoto(File f) {try {// 启动gallery去剪辑这个照片final Intent intent = getCropImageIntent(Uri.fromFile(f));startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);} catch (Exception e) {Toast.makeText(this, R.string.photoPickerNotFoundText,Toast.LENGTH_LONG).show();}}/*** Constructs an intent for image cropping. 调用图片剪辑程序*/public static Intent getCropImageIntent(Uri photoUri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(photoUri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 80);intent.putExtra("outputY", 80);intent.putExtra("return-data", true);return intent;}。
Android Camera 调用流程Android Camera的代码结构Android的Camera代码主要在以下的目录中:Camera的JAVA部分packages/apps/Camera/。
其中Camera.java是主要实现的文件。
这部分内容编译成为目标是Camera.apkcom.android.camera这个包,几个主要的类文件如下:PhotoViewer:GalleryPicker.java(所有图片集)--->ImageGallery.java(某个Folder下图片列表)--->ViewImage.java(看某张具体图片)VideoPlayer:GalleryPicker.java(所有视频集)--->MovieView.java(看某一个视频)Camera:Camera.java(Camera取景及拍照)VideoCamera:VideoCamera.java(VideoCamera取景及摄像)Camera的framework供上层应用调用的部分base/core/java/android/hardware/Camera.java这部分目标是framework.jarCamera的JNI部分frameworks/base/core/jni/android_hardware_Camera.cpp这部分内容编译成为目标是libandroid_runtime.so。
Camera UI库部分frameworks/base/libs/camera这部分的内容被编译成库libcamera_client.so。
Camera服务部分frameworks/base/services/camera/libcameraservic这部分内容被编译成库libcameraservice.so。
Camera HAL层部分hardware/msm7k/libcamera或vendor/qcom/android-open/libcamera2为了实现一个具体功能的Camera,在HAL层需要一个硬件相关的Camera库(例如通过调用video for linux驱动程序和Jpeg编码程序实现或者直接用各个chip厂商实现的私有库来实现,比如Qualcomm实现的libcamera.so和libqcamera.so),实现CameraHardwareInterface规定的接口,来调用相关的库,驱动相关的driver,实现对camera 硬件的操作。
javacameraview用法Javacameraview是一个在Java中使用相机功能的开源库。
它提供了一些简单易用的方法来实现拍照、录像和预览相机画面等功能。
要使用javacameraview,首先需要在项目中引入该库。
你可以在Github上找到该库的源码,然后将它添加到你的项目中。
在使用javacameraview之前,你需要在AndroidManifest.xml文件中添加相机权限。
这可以通过在<manifest>标签内添加以下代码来实现:<uses-permission android:name="android.permission.CAMERA" />接下来,在你的布局文件中,你需要添加一个Javacameraview实例。
这可以通过使用以下代码在<RelativeLayout>或<FrameLayout>标签内来实现:<com.example.javacameraview.JavaCameraViewandroid:id="@+id/camera_view"android:layout_width="match_parent"android:layout_height="match_parent"/>在你的Activity或Fragment中,你需要初始化Javacameraview实例。
你可以通过以下代码在onCreate()方法中实现:JavaCameraView mJavaCameraView;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);mJavaCameraView = (JavaCameraView) findViewById(R.id.camera_view);}接下来,在onResume()方法中,你需要调用startCamera()方法来启动相机预览功能,并设置相机预览的尺寸。
Android⾃定义相机超详细讲解Android⾃定义相机超详细讲解由于⽹上关于Android⾃定义相机的⽂章写得不是太详细,Google官⽅的⽂档⼜说得不太容易理解,所以今天我来详细讲解⼀下Android⾃定义相机。
这篇⽂章主要写给⼀些刚刚接触Android的那些看官⽅API困难以及不太了解Android机制的同学们,所以熟练开发者可以绕道了。
最近在使⽤Camera类的时候发现居然被弃⽤了,API 21中出现了camera2这个类来代替camera类,但是笔者的⼿机才andorid 4.4,国内要⽤上6.0⾄少明年去了,所以本次还是讲解Camera这个类。
⾸先是加⼊权限,这个直接按照google的api向导或者看api⽂档会有详细说明的,所以这⾥不讲了。
那么接下来,使⽤相机我们总需要⼀个能够看到图像的地⽅吧,这⾥Google叫我们使⽤SurfaceView这个类,那么SurfaceView这个类是什么呢,⾸先这个类是继承View的,可以在将图像绘制在屏幕上并显⽰给⽤户。
其实能够显⽰的原因是SurfaceView中包含⼀个Surface对象,Surface是SurfaceView的可见部分,好了我们提到了Surface,⼜是⼀个让很多⼈头疼的概念,好吧让我们重头来讲解。
⾸先我们在⼿机屏幕上看到的是这些画⾯都可以算是View(当然SurfaceView也算View),那么View是什么?View其实就是⼿机内存中的⼀⼩块区域,所谓显⽰,就是显卡等硬件将内存中的信息显⽰在屏幕上的过程,这下我想⼤家应该清楚⼀点了吧,我们继续,那我们说到的可见部分⼜是怎么回事呢,其实我们看到的屏幕可以说是2维的,也就是长和宽,但是在它的内部其实是3维的,还有⼀个维度就是层Layer,也就是层的概念,⽤过Visio或者AutoCAD的同学应该很好理解,在画图的时候,上层有时会将下层的遮挡,我们看到的图像就是这样⼀层⼀层堆叠起来的,这当中有些层不可见,有些层部分可见,有些层完全可见,我们看到的就是它们之中可见的部分,⽽Surface就是SurfaceView中的⼀个可见的部分,我们在摄像或者拍照⽤的就是它显⽰了。
Android是目前最流行的移动操作系统之一,拥有庞大的用户群体和丰富的应用开发资源。
在Android开发中,图像识别和二维码识别功能已经成为了热门的技术,为应用程序的开发增添了更多的可能性。
本文将介绍如何使用Android的图像识别和二维码识别功能进行开发。
一、图像识别功能的开发1. 图像识别原理图像识别是通过分析和处理图像中的信息,来识别出图像中的物体或特定的内容。
在Android开发中,可以利用Google提供的Vision API来实现图像识别功能。
Vision API使用机器学习的算法,可以识别出图像中的物体、文字等。
2. 集成Vision API要使用Vision API,首先需要在项目中引入Google Play服务库。
然后,在项目的文件中添加如下依赖项:```javaimplementation ':play-services-vision:'```接下来,在需要使用图像识别功能的地方,可以通过以下代码创建一个Vision API的实例:```javaGoogleApiClient mGoogleApiClient = new (this).addApi().build();();```3. 图像识别功能的实现在通过Vision API创建实例后,就可以使用该实例进行图像识别了。
例如,可以通过以下代码来实现在拍照后识别图像中的物体:```java// 创建一个Detector对象BarcodeDetector barcodeDetector = new (context).build();// 加载要识别的图像Bitmap bitmap = (imagePath);// 创建一个Frame对象Frame frame = new ().setBitmap(bitmap).build();// 识别图像中的内容SparseArray<Barcode> barcodes = (frame);// 获取识别结果if (() > 0) {Barcode barcode = (0);String barcodeValue = ;// 处理识别结果...}```二、二维码识别功能的开发1. 二维码识别原理二维码是一种编码方式,通过将信息以黑白像素点的方式编码成图形,从而实现信息的存储和识别。
移动应用开发中的摄像头调用实现方法介绍在移动应用开发中,摄像头调用是一项常见的技术需求。
通过调用摄像头,开发人员可以为应用增加拍照、录像等功能,提升用户体验。
本文将介绍移动应用开发中的摄像头调用实现方法。
一、硬件设备支持在进行摄像头调用之前,首先要确保设备硬件支持摄像头功能。
毕竟,不是所有的设备都配备了摄像头。
对于Android开发,可以通过检查设备的摄像头数量来判断是否支持。
通过调用Camera.getNumberOfCameras()方法,可以获取设备上摄像头的数量,如果返回的值大于0,说明设备支持摄像头功能。
二、调用系统相机应用一种常见的摄像头调用方法是直接调用系统相机应用。
通过Intent来启动相机应用,然后接收相机返回的图片或视频。
这种方法简单且适用于大多数场景。
在Android开发中,可以使用如下代码来调用系统相机应用:Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);通过ACTION_IMAGE_CAPTURE参数,将Intent的目标指向系统相机应用。
然后使用startActivityForResult()方法启动相机应用。
启动相机应用后,用户可以进行拍照,拍摄完成后,相机应用会返回一个Thumbnail和一张完整的图片。
在活动的onActivityResult()方法中,可以通过判断请求码和结果码来处理拍照结果:protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode ==RESULT_OK) {// 处理拍照结果Bundle extras = data.getExtras();Bitmap imageBitmap = (Bitmap) extras.get("data");imageView.setImageBitmap(imageBitmap);}}这里,我们通过getStringExtra()方法获取到拍照结果的图片路径,然后将其显示在ImageView上。
一、概述随着手机摄影的普及,拍照功能成为了手机应用中的一个重要组成部分。
在开发手机应用的过程中,我们经常需要使用相机拍照功能,并将拍摄的照片保存到相册中。
本文将介绍在Android评台上实现这一功能的代码流程。
二、初始化相机在使用相机拍照之前,我们需要先初始化相机,并设置一些基本的参数。
在Android评台上,我们可以使用Camera类来实现相机的初始化工作。
我们需要通过调用Camera.open()方法来打开相机,并获取到Camera实例。
我们可以通过调用Camera.getParameters()方法来获取相机的参数设置,并对相机的预览图像、拍照分辨率等进行配置。
我们通过调用Camera.setParameters()方法来将配置好的参数应用到相机中。
三、实现拍照功能一旦相机初始化完成,我们就可以开始实现拍照功能了。
在Android 评台上,我们可以通过调用Camera.takePicture()方法来实现拍照操作。
在调用该方法之前,我们需要先设置好拍照的一些参数,如拍照回调函数、拍照声音等。
当调用了Camera.takePicture()方法之后,相机会触发拍照操作,并将拍摄的照片数据通过拍照回调函数返回给我们。
四、保存照片到相册当我们拍摄到照片数据之后,我们需要将其保存到相册中。
在Android评台上,我们可以通过调用MediaStore.Images.Media.insertImage()方法来将照片保存到相册中。
需要注意的是,我们需要将照片保存为一个文件,并将该文件的路径作为参数传递给MediaStore.Images.Media.insertImage()方法。
我们还可以通过调用Toast.makeText()方法来显示保存成功的提示信息。
五、释放相机资源在完成拍照和保存照片操作之后,我们需要及时释放相机资源,以便其他应用能够正常使用相机。
在Android评台上,我们可以通过调用Camera.release()方法来释放相机资源。
android takephoto用法(一)Android TakePhoto使用方法详解Android TakePhoto是一个功能强大的拍照和相册选择库。
它提供了简单易用的API,可以轻松地在Android应用中实现拍照、相册选择和图片裁剪等功能。
下面是Android TakePhoto的一些主要用法:1. 基本用法Android TakePhoto的基本用法非常简单,在Activity或Fragment中通过以下步骤即可实现拍照或相册选择功能:1.创建TakePhoto实例:TakePhoto takePhoto = getTakePhoto();2.启动拍照或相册选择:(imageUri);// 或();3.处理拍照或相册选择结果:@Overridepublic void onActivityResult(int requestCode, int r esultCode, Intent data) {(requestCode, resultCode, data);(requestCode, resultCode, data);}2. 图片裁剪Android TakePhoto还提供了图片裁剪功能,可以对拍照或相册选择的图片进行裁剪操作。
以下是图片裁剪的用法:1.创建TakePhoto实例(同基本用法)。
2.设置裁剪参数:builder = new ();(1).setAspectY(1); // 设置裁剪比例为1:1(false); // 使用系统裁剪工具CropOptions cropOptions = ();(cropOptions);3.启动图片裁剪:(imageUri, cropOptions);// 或(imageUri, cropOptions);4.处理图片裁剪结果(同基本用法)。
3. 自定义配置Android TakePhoto还提供了丰富的自定义配置选项,可以根据需要定制拍照和相册选择的行为。
android实现简单拍照功能拍照可以调⽤系统的相机进⾏拍照,拍完保存到相应的SD卡⽬录。
最近要⽤到拍照这个功能,⾸先试了下调⽤相机拍照,保存到相应⽬录,然后⽤imageview显⽰的时候感觉,很模糊。
可能是图⽚被压缩的太狠了。
所以⾃⼰使⽤Camera写了⼀个拍照的功能,拍出来的还挺清晰的,不过⽂件有点⼤⼀张图⽚差不多1.7M。
如果想拍⾼清图可以使⽤下⾯的代码。
代码很简单,我就不做过多解释了。
package com.example.testsimple;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.Date;import android.os.AsyncTask;import android.os.Bundle;import android.os.Environment;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.PixelFormat;import android.hardware.Camera;import android.text.format.DateFormat;import android.util.Log;import android.view.KeyEvent;import android.view.Menu;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends Activity {private SurfaceView surfaceView;private SurfaceHolder surfaceHolder;private Camera camera;private File picture;private Button btnSave;private final static String TAG = "CameraActivity";private ImageView open_picIcon;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);/* Intent intent=new Intent(MainActivity.this,MyCameraActivity.class);startActivity(intent);finish();*/setupViews();}private void setupViews(){surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate componentssurfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate componentssurfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHoldersurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);btnSave = (Button) findViewById(R.id.save_pic);open_picIcon=(ImageView) findViewById(R.id.open_picIcon);btnSave.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {surfaceView.setVisibility(View.VISIBLE);open_picIcon.setVisibility(View.GONE);takePic();}});}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_CAMERA|| keyCode == KeyEvent.KEYCODE_SEARCH) {takePic();return true;}return super.onKeyDown(keyCode, event);}private void takePic() {camera.stopPreview();// stop the previewcamera.takePicture(null, null, pictureCallback); // picture}// Photo call backCamera.PictureCallback pictureCallback = new Camera.PictureCallback() {//@Overridepublic void onPictureTaken(byte[] data, Camera camera) {new SavePictureTask().execute(data);camera.startPreview();}};// save picclass SavePictureTask extends AsyncTask<byte[], String, String> {@Overrideprotected String doInBackground(byte[]... params) {String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());//picture = new File(Environment.getExternalStorageDirectory(),fname);// create filepicture = new File(Environment.getExternalStorageDirectory()+"/images/"+fname);File file= picture.getParentFile();if(!file.exists())file.mkdir();try {FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream fos.write(params[0]); // Written to the filefos.close();} catch (Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(String result) {// TODO Auto-generated method stubsuper.onPostExecute(result);Bitmap bitmap=getDiskBitmap(picture.getPath());surfaceView.setVisibility(View.GONE);open_picIcon.setVisibility(View.VISIBLE);open_picIcon.setImageBitmap(bitmap);}}private Bitmap getDiskBitmap(String pathString){Bitmap bitmap = null;try{File file = new File(pathString);if(file.exists()){bitmap = BitmapFactory.decodeFile(pathString);}} catch (Exception e){// TODO: handle exception}return bitmap;}// SurfaceHodler Callback handle to open the camera, off camera and photo size changesSurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {public void surfaceCreated(SurfaceHolder holder) {Log.i(TAG, "surfaceCallback====");camera = Camera.open(); // Turn on the cameratry {camera.setPreviewDisplay(holder); // Set Preview} catch (IOException e) {camera.release();// release cameracamera = null;}}public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {Log.i(TAG,"====surfaceChanged");Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format// parameters.set("rotation", 180); // Arbitrary rotationcamera.setDisplayOrientation(0);parameters.setPreviewSize(400, 300); // Set Photo Sizecamera.setParameters(parameters); // Setting camera parameterscamera.startPreview(); // Start Preview}public void surfaceDestroyed(SurfaceHolder holder) {Log.i(TAG,"====surfaceDestroyed");camera.stopPreview();// stop previewcamera.release(); // Release camera resourcescamera = null;}};}拍完以后⾃动保存到SD卡中的images⽬录下下⾯是图⽚存放路径1.8M 确实有点⼤,不过是⾼清图⽚以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
001public class CameraActivity extends Activity
002 implements Callback, OnClickListener {
003
004 private static final int MENU_START = 1;
005 private static final int MENU_UP=2;
006 private static final int MENU_CANCEL=2;
007 private SurfaceView mSurfaceView;
008 private SurfaceHolder mSurfaceHolder;
009 private Camera mCamera;
010 private boolean mPreviewRunning;
011 private ImageView mImageView;
012
013 /**
014 * 拍照的回调接口
015 */
016 PictureCallback mPictureCallback = new PictureCallback() { 017
018 public void onPictureTaken(byte[] data, Camera camera) { 019 Log.d("PictureCallback", "...onPictureTaken..."); 020 if(data != null) {
021 try{
022 DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("/sdcard/camera.jpg"));
02 3 dataOutputStream.write(da ta);
02
4
dataOutputStream.flush(); 025 } catch(Exception e) {
026 Log.e("PictureCallback", e.toString());
027 }
028 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
029 data.length);
030 mImageView.setImageBitmap(bitmap);
031 mImageView.setVisibility(View.VISIBLE); 032 mSurfaceView.setVisibility(View.GONE); 033 if(mPreviewRunning) {
034 mCamera.stopPreview();
035 mPreviewRunning = false;
036 }
037
038
}
039 }
040
041 };
042 /**
043 * 例如:使设备震动
044 */
045 ShutterCallback mShutterCallback = new ShutterCallback() { 046
047 public void onShutter() {
048 //just log ,do nothing
049 Log.d("ShutterCallback", "...onShutter...");
050 }
051
052 };
053
054 /** Called when the activity is first created. */
055 @Override
056 public void onCreate(Bundle savedInstanceState) {
057 super.onCreate(savedInstanceState);
058
059 requestWindowFeature(Window.FEATURE_NO_TITLE);
060 getWindow().setFormat(PixelFormat.TRANSLUCENT);
06 1 getWindow().setFlags(youtParams.FLAG_FULLS CREEN,
062 youtParams.FLAG_FULLSCREEN);
063 setContentView(yout.camera);
064 mSurfaceView = (SurfaceView) findViewById(R.id.camera); 065 mImageView = (ImageView) findViewById(R.id.image);
066 mImageView.setVisibility(View.GONE);
067
068 mSurfaceView.setOnClickListener(this);
069 mSurfaceHolder = mSurfaceView.getHolder();
070 mSurfaceHolder.addCallback(this);
07 1 mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUF FERS);
072
073 }
074
075 @Override
076 public boolean onCreateOptionsMenu(Menu menu) {
077 super.onCreateOptionsMenu(menu);
078 menu.add(0, MENU_START, 0, R.string.camera_start); 079 menu.add(1, MENU_UP, 0, R.string.camera_UP);
080 menu.add(2, MENU_CANCEL, 0, R.string.camera_cancel); 081 return true;
082 }
083
084 @Override
085 public boolean onOptionsItemSelected(MenuItem item) { 086 if(item.getItemId() == MENU_START) { //拍照
087 mImageView.setVisibility(View.GONE);
088 mSurfaceView.setVisibility(View.VISIBLE);
089 if(mPreviewRunning) {
090 mCamera.stopPreview();
091 }
092 mCamera.startPreview();
093
094 mPreviewRunning = true;
095 return true;
096 }
097 if(item.getItemId() ==MENU_UP){ //上传照片
098
099
100 }
101 if(item.getItemId() ==MENU_CANCEL){ //取消操作
102
103 CameraActivity.this.finish();
104 }
105 return super.onOptionsItemSelected(item);
106 }
107
108 public void surfaceChanged(SurfaceHolder holder, int format, int width,
109 int height) {
110 if(mPreviewRunning) {
111 mCamera.stopPreview(); 112 }
113 Parameters params = mCamera.getParameters();
114 params.setPreviewSize(120, 120); //直接规定照片大小115 mCamera.setParameters(params);
116
117 try{
118 mCamera.setPreviewDisplay(holder);
119 } catch(IOException e) {
120
e.printStackTrace();
121 }
122 mCamera.startPreview();
123 mPreviewRunning = true;
124 }
125
126 public void surfaceCreated(SurfaceHolder holder) {
127 mCamera = Camera.open();
128 }
129
130 public void surfaceDestroyed(SurfaceHolder holder) { 131 mCamera.stopPreview();
132 mPreviewRunning = false;
133 mCamera.release();
134 mCamera = null;
135 }
136
137 public void onClick(View v) {
138 mCamera.takePicture(mShutterCallback, null, mPictureCallback);
139 } 140}。