版权声明:https://mp.csdn.net/postedit
用到了摄像头 所以就写了下,网上大神的特别多,我也就扣扣改改,先上图
点击按钮
点击拍照
点击从相册中选择则
大致效果都在上面了,接着贴代码
先上xml
只有一个Activity
package com.example.yangzhan.camreatest; import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.FileProvider; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Display; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.zxy.tiny.Tiny; import com.zxy.tiny.callback.FileWithBitmapCallback; import java.io.File; import java.io.IOException; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG ="MainActivity"; //调用系统摄像头请求码 private static final int MY_ADD_CASE_CALL_PHONE = 6; //调用系统相册请求码 private static final int MY_ADD_CASE_CALL_PHONE2 = 7; private Button mBtnCall; private ImageView mImg; private AlertDialog mDlg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnCall =findViewById(R.id.btCall); mImg =findViewById(R.id.image); mBtnCall.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btCall: Log.e(TAG, "onClick: "); showDilg(); break; case R.id.photograph: Log.e(TAG, "onClick2: "); CallCamera(); break; case R.id.photo: Log.e(TAG, "onClick3: "); CallingAlbum(); break; case R.id.cancel: Log.e(TAG, "onClick4: "); mDlg.dismiss(); break; default: break; } } private void CallingAlbum() { //6.0动态申请权限,摄像头权限,SD卡写入取权限 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},MY_ADD_CASE_CALL_PHONE ); }else { choosePhoto(); } mDlg.dismiss(); } /** * 打开相册 */ private void choosePhoto() { //这是打开系统默认的相册(就是你系统怎么分类,就怎么显示,首先展示分类列表) Intent picture = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(picture, 2); } private void CallCamera() { //6.0动态申请权限,摄像头权限,SD卡读取权限 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},MY_ADD_CASE_CALL_PHONE ); }else { try{ takePhoto(); }catch (Exception e){e.printStackTrace();} } mDlg.dismiss(); } private void takePhoto() throws IOException { Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); // 获取文件 File file = createFileIfNeed("UserIcon.png"); //拍照后原图回存入此路径下 Uri uri; if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) { uri = Uri.fromFile(file); } else { /** * 7.0 调用系统相机拍照不再允许使用Uri方式,应该替换为FileProvider * 并且这样可以解决MIUI系统上拍照返回size为0的情况 */ uri = FileProvider.getUriForFile(this, "com.example.yangzhan.camreatest.fileprovider", file); } intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); startActivityForResult(intent, 1); } // 在sd卡中创建一保存图片(原图和缩略图共用的)文件夹 private File createFileIfNeed(String fileName) throws IOException { String fileA = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/nbinpic"; File fileJA = new File(fileA); if (!fileJA.exists()) { fileJA.mkdirs(); } File file = new File(fileA, fileName); if (!file.exists()) { file.createNewFile(); } return file; } private void showDilg(){ AlertDialog.Builder builder =new AlertDialog.Builder(this); View layout = getLayoutInflater().inflate(R.layout.dialog_select_photo,null); builder.setView(layout); mDlg = builder.create(); Window window = mDlg.getWindow(); window.setGravity(Gravity.BOTTOM); mDlg.setCanceledOnTouchOutside(true); Log.e(TAG, "showDilg: " ); mDlg.show(); WindowManager manager = getWindowManager(); Display d=manager.getDefaultDisplay(); WindowManager.LayoutParams p= mDlg.getWindow().getAttributes(); p.width=d.getWidth(); window.setBackgroundDrawable(new ColorDrawable(0)); TextView button1 = layout.findViewById(R.id.photograph); TextView button2 = layout.findViewById(R.id.photo); TextView button3 = layout.findViewById(R.id.cancel); button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == MY_ADD_CASE_CALL_PHONE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { try { takePhoto(); } catch (IOException e) { e.printStackTrace(); } } else { //"权限拒绝"); Toast.makeText(this, "请求摄像头权限被拒绝了", Toast.LENGTH_SHORT).show(); } } if (requestCode == MY_ADD_CASE_CALL_PHONE2) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { choosePhoto(); } else { //"权限拒绝"); Toast.makeText(this, "请求SDka权限被拒绝了", Toast.LENGTH_SHORT).show(); } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode != Activity.RESULT_CANCELED) { String state = Environment.getExternalStorageState(); if (!state.equals(Environment.MEDIA_MOUNTED)) return; // 把原图显示到界面上 Tiny.FileCompressOptions options = new Tiny.FileCompressOptions(); Tiny.getInstance().source(readpic()).asFile().withOptions(options).compress(new FileWithBitmapCallback() { @Override public void callback(boolean isSuccess, Bitmap bitmap, String outfile, Throwable t) { saveImageToServer(bitmap, outfile); } }); } else if (requestCode == 2 && resultCode == Activity.RESULT_OK && null != data) { try { Uri selectedImage = data.getData(); Tiny.FileCompressOptions options = new Tiny.FileCompressOptions(); Tiny.getInstance().source(selectedImage).asFile().withOptions(options).compress(new FileWithBitmapCallback() { @Override public void callback(boolean isSuccess, Bitmap bitmap, String outfile, Throwable t) { saveImageToServer(bitmap, outfile); } }); } catch (Exception e) { //"上传失败"); } } } /** * 从保存原图的地址读取图片 */ private String readpic() { String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/nbinpic/" + "UserIcon.png"; return filePath; } private void saveImageToServer(final Bitmap bitmap, String outfile) { File file = new File(outfile); mImg.setImageBitmap(bitmap); } }
主要注意几点问题:
1.动态权限申请
2.7.0以上的系统 出于安全考虑,不会将手机真是路径反馈给你需要xml中建立file_paths文件,用于映射apk位置
获取路径改为:
uri = FileProvider.getUriForFile(this, "com.example.yangzhan.camreatest.fileprovider", file);
并且在清单文件中加入
不然会报错,其他到在注释中都有。。。