首先集成两个lib库
compile 'com.github.f15997123593.fzqLib:cameralib:v4.0' compile 'com.github.f15997123593.fzqLib:takephoto_library:v4.0'然后添加权限,
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-feature android:name="android.hardware.camera"/> <uses-feature android:name="android.hardware.camera.autofocus"/>
跳转到微信拍摄视频界面如下:首先请求权限
private final int GET_PERMISSION_REQUEST = 100; //权限申请自定义码 /** * 获取权限 */ private void getPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager .PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager .PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager .PERMISSION_GRANTED) { startActivityForResult(new Intent(OrderActivity.this, CameraActivity.class), 100); } else { //不具有获取权限,需要进行权限申请 ActivityCompat.requestPermissions(OrderActivity.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA}, GET_PERMISSION_REQUEST); } } else { startActivityForResult(new Intent(OrderActivity.this, CameraActivity.class), 100); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == 101) { Log.i("CJT", "picture"); String path = data.getStringExtra("path"); Log.i("path", ""+path); //photo.setImageBitmap(BitmapFactory.decodeFile(path)); } if (resultCode == 102) { Log.i("CJT", "video"); String path = data.getStringExtra("path"); } if (resultCode == 103) { Toast.makeText(this, "请检查相机权限~", Toast.LENGTH_SHORT).show(); } } @TargetApi(23) @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == GET_PERMISSION_REQUEST) { int size = 0; if (grantResults.length >= 1) { int writeResult = grantResults[0]; //读写内存权限 boolean writeGranted = writeResult == PackageManager.PERMISSION_GRANTED;//读写内存权限 if (!writeGranted) { size++; } //录音权限 int recordPermissionResult = grantResults[1]; boolean recordPermissionGranted = recordPermissionResult == PackageManager.PERMISSION_GRANTED; if (!recordPermissionGranted) { size++; } //相机权限 int cameraPermissionResult = grantResults[2]; boolean cameraPermissionGranted = cameraPermissionResult == PackageManager.PERMISSION_GRANTED; if (!cameraPermissionGranted) { size++; } if (size == 0) { startActivityForResult(new Intent(OrderActivity.this, CameraActivity.class), 100); } else { Toast.makeText(this, "请到设置-权限管理中开启", Toast.LENGTH_SHORT).show(); } } } }调用getPermissions() 跳转拍摄界面;
拍摄界面布局代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:fitsSystemWindows="true" android:layout_height="match_parent"> <com.fzq.cameralib.JCameraView android:id="@+id/jcameraview" android:layout_width="match_parent" android:layout_height="match_parent" app:duration_max="10000" app:iconMargin="20dp" app:iconLeft="@drawable/ic_back" app:iconRight="@drawable/ic_photo" app:iconSize="30dp" app:iconSrc="@drawable/ic_camera" /> </LinearLayout>文件代码如下:
public class CameraActivity extends AppCompatActivity implements TakePhoto.TakeResultListener, InvokeListener { private JCameraView jCameraView; private InvokeParam invokeParam; private TakePhoto takePhoto; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_camera); jCameraView = (JCameraView) findViewById(R.id.jcameraview); //设置视频保存路径 jCameraView.setSaveVideoPath(Environment.getExternalStorageDirectory().getPath() + File.separator + "JCamera"); jCameraView.setFeatures(JCameraView.BUTTON_STATE_BOTH); // jCameraView.setTip("JCameraView Tip"); jCameraView.setMediaQuality(JCameraView.MEDIA_QUALITY_MIDDLE); jCameraView.setErrorLisenter(new ErrorListener() { @Override public void onError() { //错误监听 Log.i("CJT", "camera error"); Intent intent = new Intent(); setResult(103, intent); finish(); } @Override public void AudioPermissionError() { Toast.makeText(CameraActivity.this, "给点录音权限可以?", Toast.LENGTH_SHORT).show(); } }); //JCameraView监听 jCameraView.setJCameraLisenter(new JCameraListener() { @Override public void captureSuccess(Bitmap bitmap) { //获取图片bitmap // Log.i("JCameraView", "bitmap = " + bitmap.getWidth()); String path = FileUtil.saveBitmap("JCamera", bitmap); Intent intent = new Intent(); intent.putExtra("path", path); setResult(101, intent); finish(); } @Override public void recordSuccess(String url, Bitmap firstFrame) { //获取视频路径 String path = FileUtil.saveBitmap("JCamera", firstFrame); Log.i("CJT", "url = " + url + ", Bitmap = " + path); Intent intent = new Intent(); intent.putExtra("path", path); setResult(101, intent); finish(); } }); jCameraView.setLeftClickListener(new ClickListener() { @Override public void onClick() { CameraActivity.this.finish(); } }); jCameraView.setRightClickListener(new ClickListener() { @Override public void onClick() { autoObtainStoragePermission(); // Toast.makeText(CameraActivity.this,"Right",Toast.LENGTH_SHORT).show(); } }); Log.i("CJT", DeviceUtil.getDeviceModel()); } @Override protected void onStart() { super.onStart(); //全屏显示 if (Build.VERSION.SDK_INT >= 19) { android.view.View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility( android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE | android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | android.view.View.SYSTEM_UI_FLAG_FULLSCREEN | android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } else { android.view.View decorView = getWindow().getDecorView(); int option = android.view.View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(option); } } @Override protected void onResume() { super.onResume(); jCameraView.onResume(); } @Override protected void onPause() { super.onPause(); jCameraView.onPause(); } //集成选图片功能 @Override protected void onSaveInstanceState(Bundle outState) { getTakePhoto().onSaveInstanceState(outState); super.onSaveInstanceState(outState); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { getTakePhoto().onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionManager.TPermissionType type = PermissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionManager.handlePermissionsResult(this, type, invokeParam, this); } public TakePhoto getTakePhoto() { if (takePhoto == null) { takePhoto = (TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(this, this)); } return takePhoto; } @Override public void takeFail(TResult result, String msg) {} @Override public void takeCancel() {} @Override public PermissionManager.TPermissionType invoke(InvokeParam invokeParam) { PermissionManager.TPermissionType type = PermissionManager.checkPermission(TContextWrap.of(this), invokeParam.getMethod()); if (PermissionManager.TPermissionType.WAIT.equals(type)) { this.invokeParam = invokeParam; } return type; } //获取图片成功回调 @Override public void takeSuccess(TResult result) { String filePath = result.getImage().getCompressPath(); Log.e("takeSuccess",filePath); // Glide.with(this).load(new File(result.getImages().get(0).getCompressPath())).into(headiv); } private void autoObtainStoragePermission() { File file = new File(Environment.getExternalStorageDirectory(), "/JCamera/" + System.currentTimeMillis() + ".jpg"); TakePicUtil.sampleChoosePic(file,getTakePhoto()); } }我在这里合并了拍摄视频和相册选择文件到同一个Activity中
github地址如下: https://github.com/f15997123593/fzqLib
