单位做网站注意什么问题,福田祥菱m2柴油版,wordpress 底部小工具,西安网站建设哪个平台好相机现在已经不仅仅是手机必备神器了#xff0c;甚至相机的拍照质量已经是很多人买手机的首选条件了。而对于相机而言主要有两大功能#xff1a;拍照片和拍视频。Android 为此两种方式#xff1a;
相机 intent相机 API 本节我们就一起来看看相机的具体用法。 1. 打开 Camer…相机现在已经不仅仅是手机必备神器了甚至相机的拍照质量已经是很多人买手机的首选条件了。而对于相机而言主要有两大功能拍照片和拍视频。Android 为此两种方式
相机 intent相机 API 本节我们就一起来看看相机的具体用法。 1. 打开 Camera 的两大方式
目前市面上绝大多数的 Android 手机是有前后两个摄像头当然有部分特殊机型会存在其他的情况本节主要针对双摄像头设备做解析。 在前面有提到过通常使用相机有两大方式“Intent”和“API”。最大的差别就是“Intent”是跳转到系统提供的相机页面而使用“API”是封闭在自己的 App 中使用相机。我们可以通过“Intent”直接打开系统提供的相机 Activity在用户拍摄完成之后系统 Activity 会通知我们拍摄结果然后拿到拍摄的图片或者视频。而直接通过 API 就需要我们去开发一整套相机的控制页面自行完成照片 / 视频的拍摄进而直接拿到用户拍摄的结果。 2. Camera 的基本用法
我们分别看看这两种打开方式的使用方法 2.1 使用 Intent 打开
通过使用 MediaStore 类提供的两个 Intnet 常量可以直接将相机操作托管给 Android 系统而无需创建 Camera 实例
ACTION_IMAGE_CAPTURE 拍摄照片ACTION_VIDEO_CAPTURE 拍摄视频 2.2 使用 API 打开
采用 API 打开会让整个相机程序都封闭在自己的 APP 中完成这里需要明确几个概念 Camera 类 使用 API 之前需要创建 Camera 实例然后通过 API 来初始化 Camera 进而拿到实时拍摄的画面 SurfaceView 用来渲染视频实时画面的 View
采用 Intent 打开相机的方法非常简单接下来我们全程使用 Camera API 来实现一下相机功能。 3. Camera 使用示例
使用 API 来拍照会相对比较麻烦一点首先需要获取权限那么对于 Android 6.0 版本以上的系统除了要在 Manifest 里面加入 Camera 权限之外还需要动态获取权限这个可能大家在用一些比较老的教程示例时会踩坑。 获取到权限就可以打开 Camera 了然后拿到 Camera 实例设置一个 SurfaceView 来渲染预览页面在用户需要拍照的时候调用 Camera 的takePicture()方法获取当前帧最后保存输出到文件中或者在新的 Activity 中展示这样就算完成了一次拍照闭环。 3.1 Camera 拍照逻辑
首先看看整个拍照的代码如下 package com.emercy.myapplication;import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;public class MainActivity extends Activity {public static final String CAMERA_PATH path;public static final String CAMERA_IMG img;private SurfaceView mSurfaceView;private Button mTakePhoto;private Camera mCamera null;private SurfaceHolder.Callback mCallback new SurfaceHolder.Callback() {Overridepublic void surfaceCreated(SurfaceHolder holder) {startPreview();}Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}Overridepublic void surfaceDestroyed(SurfaceHolder holder) {stopPreview();}};Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getPermission();bindViews();}/*** 获取权限*/private void getPermission() {if (Build.VERSION.SDK_INT 22) {if (checkSelfPermission(android.Manifest.permission.CAMERA) ! PackageManager.PERMISSION_GRANTED) {//先判断有没有权限 没有就在这里进行权限的申请requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);} else {//说明已经获取到摄像头权限了Log.i(Camera, 已经获取了权限);}} else {//这个说明系统版本在6.0之下不需要动态获取权限。Log.i(Camera, 这个说明系统版本在6.0之下不需要动态获取权限。);}}private void bindViews() {mSurfaceView (SurfaceView) findViewById(R.id.sfv_preview);mTakePhoto (Button) findViewById(R.id.btn_take);mSurfaceView.getHolder().addCallback(mCallback);mTakePhoto.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {mCamera.takePicture(null, null, new Camera.PictureCallback() {Overridepublic void onPictureTaken(byte[] data, Camera camera) {String path;if (TextUtils.isEmpty(path savePhoto(data))) {Intent it new Intent(MainActivity.this, PreviewActivity.class);it.putExtra(CAMERA_PATH, path);startActivity(it);} else {Toast.makeText(MainActivity.this, 拍照失败, Toast.LENGTH_SHORT).show();}}});}});}private String savePhoto(byte[] bytes) {try {File file File.createTempFile(CAMERA_IMG, );FileOutputStream fos new FileOutputStream(file);fos.write(bytes);fos.flush();fos.close();return file.getAbsolutePath();} catch (IOException e) {e.printStackTrace();}return ;}private void startPreview() {mCamera Camera.open();try {mCamera.setPreviewDisplay(mSurfaceView.getHolder());mCamera.setDisplayOrientation(90); // 让相机旋转90度mCamera.startPreview();} catch (IOException e) {e.printStackTrace();}}private void stopPreview() {mCamera.stopPreview();mCamera.release();mCamera null;}
}里面涉及到的几个新概念大家需要注意然后记得在SurfaceHolder.Callback()的surfaceCreated()中启动预览在surfaceDestroyed()方法中要停止预览其他的基本上按照步骤来不会有什么问题。 3.2 相机布局
目前市面上有很多相机 App各种布局千变万化大家完全可以按照自己的喜好来进行设计。这里只做一个拍照预览和拍照按钮。
FrameLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalSurfaceViewandroid:idid/sfv_previewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent /Buttonandroid:idid/btn_takeandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitybottom|centerandroid:text拍照 //FrameLayout3.3 照片回看页面
点击“拍照” Button 获取到当前画面之后我们可以就可以按照自己的逻辑对图片进行操作了。比如可以通过 Http 上传、通过 Socket 发送给其他设备、保存到本地、或者传递给其他 App 等。本例子中将图片传递给另一个 Activity 专门用于查看图片下面是 PhotoActivity 的代码
package com.emercy.myapplication;import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView;import java.io.File;import static com.emercy.myapplication.MainActivity.CAMERA_PATH;public class PhotoActivity extends Activity {Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ImageView img new ImageView(this);String path getIntent().getStringExtra(CAMERA_PATH);if (path ! null) {img.setImageURI(Uri.fromFile(new File(path)));}setContentView(img);}
}通过 Intent 接收图片路径然后展示在 ImageView 上需要注意的是PhotoActivity 中是直接将 ImageView 作为参数直接设置给了 SetContentView()这样相当于布局文件中只有一个 ImageView 的写法。
最后别忘了在 Manifest 当中添加权限 uses-permission android:nameandroid.permission.CAMERA/uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE/编译运行效果如下 点击拍照进入 PhotoActivity展示的就是我们拍照的画面。 4. 小结
本节学习了一个手机上必不可少的设备通过相机我们可以拍摄照片或者视频Android 系统提供了两大打开方式Intent 调用系统相机 Activitiy或者用 Camera API 自行实现拍照功能。第一种非常简单将所有的相机操作都托管给系统我们只关心最终用户拍摄的结果而第二种就需要我们自己初始化 Camera 对象从而实现拍摄在实际开发中如果你的功能是和拍摄强相关需要一些定制化的拍摄体验那么一定要使用第二种方式来自己实现 Camera但是如果你只是一个简单的拍照获取图片那么第一种会让你事半功倍。