Android简单相机开发
来源:互联网 发布:矩阵半张量积等式的解 编辑:程序博客网 时间:2024/04/30 02:09
调用系统相机
1.调用系统相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent);
2.使应用具有相机功能
在AndroidMainifest.xml文件中的activity标签中加入下面的代码, 将会是应用具有相机功能,在其他应用调用第三方相机功能时,就会提示选择调用本应用的相机。
<intent-filter> <action android:name="android.intent.action.IMAGE_CAPTURE"/> <category android:name="android.intent.category.DEFAULT"/></intent-filter>
当然,相机具体的实现的功能还需要我们去通过代码实现。
3.拍照结束显示拍照的图片
需采用startActivityForResult()方法返回拍照结果。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,1);
在Activity中添加复写onActivityResult()方法:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == 1) { Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data"); //获取到的图片是缩略图 image.setImageBitmap(bitmap); } } }
使用上述方法显示的图片是缩略图,如果需要显示原图,那如何实现呢?
可将拍照的图片存在sdcard中,然后显示出来。
//图片存放路径String path = Environment.getExternalStorageDirectory().getPath()+"/temp.png";
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);Uri uri = Uri.fromFile(new File(path));//将拍照的图片存放在指定路径,避免其存放在拍照默认路径,方便读取intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);startActivityForResult(intent,2);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode==RESULT_OK){ if(requestCode == 2){ FileInputStream inputStream = null; try { inputStream = new FileInputStream(path); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); //获取到的图片是拍照原图 image.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
在AndroidMainifest.xml文件中添加应用SD卡读写权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
自定义相机
1.实现自定义相机步骤
1)建立camera对象
2)建立SurfaceView对象
3)将camera对象和SurfaceView对象进行绑定
2.代码实现
public class CustomCameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{ private Camera mCamera; private SurfaceView surfaceView; private SurfaceHolder holder; private Camera.PictureCallback mPictureCallBack = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File file = new File("/mnt/sdcard/temp.png"); try { FileOutputStream outputStream = new FileOutputStream(file); outputStream.write(data); outputStream.close(); Intent intent = new Intent(CustomCameraActivity.this,ResultActivity.class); intent.putExtra("path",file.getAbsolutePath()); finish(); startActivity(intent); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_camera); surfaceView = (SurfaceView) findViewById(R.id.surface); holder = surfaceView.getHolder(); holder.addCallback(this); surfaceView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCamera.autoFocus(null); } }); } @Override protected void onResume() { super.onResume(); if (mCamera == null){ mCamera = getCamera(); if (holder!=null){ setStartPreview(mCamera,holder); } } } @Override protected void onPause() { super.onPause(); releaseCamera(); } public void capture(View v){ Camera.Parameters parameters = mCamera.getParameters(); //设置拍照模式 parameters.setPictureFormat(ImageFormat.JPEG); //设置预览大小 parameters.setPreviewSize(800,400); //将对焦模式设置为自动对焦 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success){ //当对焦成功进行拍照 mCamera.takePicture(null,null,mPictureCallBack); } } }); } /** * 获取Camera对象 * @return */ private Camera getCamera(){ Camera camera = Camera.open(); return camera; } /** * 显示预览相机内容 */ private void setStartPreview(Camera camera,SurfaceHolder holder){ try { camera.setPreviewDisplay(holder); //系统默认的相机角度是横屏的,需将系统相机角度调整成竖屏 camera.setDisplayOrientation(90); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } /** * 释放相机资源 */ private void releaseCamera(){ if (mCamera!=null){ mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } } @Override public void surfaceCreated(SurfaceHolder holder) { setStartPreview(mCamera,holder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mCamera.stopPreview(); setStartPreview(mCamera,holder); } @Override public void surfaceDestroyed(SurfaceHolder holder) { releaseCamera(); }}
注意:上面使用的Camera类来自android.hardware.Camera。
布局文件:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surface" android:layout_width="match_parent" android:layout_height="match_parent" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" android:onClick="capture" android:src="@drawable/capture" /></FrameLayout>
结果返回界面代码:
public class ResultActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_result); ImageView imageView = (ImageView) findViewById(R.id.result_image); String path = getIntent().getStringExtra("path"); try { FileInputStream fileInputStream = new FileInputStream(path); Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream); Matrix matrix = new Matrix(); //将图片旋转90° matrix.setRotate(90); bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } }}
最后还有添加相机权限
<uses-permission android:name="android.permission.CAMERA" />
这种实现自定义相机的方法,如今已经过时,但用来开发简单的相机还是比较方便的。如今Android5.0提出了Camera V2,提供了更多功能,如果想要开发具有更多功能的相机,可是使用这种方法。但Camera V2要求手机SdkVersion要大于21,最小版本(minSdkVersion)升到21之前,你还是需要继续使用Camera API(android.hardware.Camera)。
0 0
- Android简单相机开发
- 简单开发相机
- android--相机开发
- android--相机开发
- android--相机开发
- android之相机开发
- Android相机开发
- Android相机开发2
- android 相机开发
- android--相机开发
- Android相机开发实战
- android之相机开发
- android相机开发文章
- android 相机开发
- Android相机开发实战
- Android自定义相机开发
- 【Android】相机的简单调用
- Android Camera 相机简单操作
- 多行游标
- JVM调优总结
- 特殊方格取数
- JS无法取得display:none元素的宽高
- linux命令的理解
- Android简单相机开发
- 常用Oracle语句
- httpRequest
- revit获取当前模型中板的数量
- 外卖-----高并发架构设计方案
- 浙江第四届省赛第一题
- stm32中的adc多次采样求均值减少误差的方法
- Spring框架的七大模块
- Stack的应用——Binary Tree Preorder Traversal