Android 访问相机拍照的爬坑日记。
来源:互联网 发布:python教程 pdf 编辑:程序博客网 时间:2024/05/11 23:14
最近被android相机拍照困扰了几天。
android6.0需要动态添加权限,在适配时不同手机对xml添加权限和动态添加要求不一样(菜鸟的个人理解)。不多说了,看代码。
public class MainActivity extends Activity { private ImageView imageView; private File output; private Uri imageUri; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } void initView() { imageView = (ImageView) findViewById(R.id.image); button = (Button) findViewById(R.id.aaaa); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { takePhone(view); } }); } public void takePhone(View view) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 2); //动态添加权限 requestCode } else {// choosePhoto(); takePhoto(); } } /** * 拍照 */ void takePhoto() { /** * 最后一个参数是文件夹的名称,可以随便起 */ File file = new File(Environment.getExternalStorageDirectory(), "拍照"); if (!file.exists()) { file.mkdir(); } /** * 这里将时间作为不同照片的名称 */ output = new File(file, System.currentTimeMillis() + ".jpg"); /** * 如果该文件夹已经存在,则删除它,否则创建一个 */ try { if (output.exists()) { output.delete(); } output.createNewFile(); } catch (Exception e) { e.printStackTrace(); } /** * 隐式打开拍照的Activity,并且传入CROP_PHOTO常量作为拍照结束后回调的标志 */ imageUri = Uri.fromFile(output); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, 1); } // /**// * 从相册选取图片// */ void choosePhoto() { /** * 打开选择图片的界面 */ Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*");//相片类型 startActivityForResult(intent, 4); } // int requestCode, int resultCode, Intent data 参数 带返回类型的intent public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { /** * 拍照的请求标志 */ case 1: if (resultCode == RESULT_OK) { try { /** * 该uri就是照片文件夹对应的uri */ Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));// 图片大小的压缩// Bitmap bm = Bitmap.createScaledBitmap(bit, 300, 300, true);// 比例压缩法 Matrix matrix = new Matrix(); matrix.setScale(0.5f, 0.5f); Bitmap bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(), bit.getHeight(), matrix, true);// 当前页面显示 imageView.setImageBitmap(bm); Intent intent = new Intent(MainActivity.this, Main2Activity.class); startActivity(intent); Log.i("wechat", "压缩前图片的大小" + (bit.getByteCount() / 1024 / 1024) + "M宽度为" + bit.getWidth() + "高度为" + bit.getHeight()); Toast.makeText(this, "完成", Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(this, "程序崩溃", Toast.LENGTH_SHORT).show(); } } else { Log.i("tag", "失败"); } break; /** * 从相册中选取图片的请求标志 */// RESULT_OK=-1 case 4: if (requestCode == RESULT_OK) { try { /** * 该uri是上一个Activity返回的 */ Uri uri = data.getData(); Bitmap bit = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); imageView.setImageBitmap(bit); } catch (Exception e) { e.printStackTrace(); Log.d("tag", e.getMessage()); Toast.makeText(this, "程序崩溃", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this, "失败", Toast.LENGTH_SHORT).show(); } break; default: break; } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == 2) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { takePhoto(); } else { Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); } } if (requestCode == 3) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { choosePhoto(); } else { Toast.makeText(MainActivity.this, "没有权限", Toast.LENGTH_SHORT).show(); } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }}
布局文件activity_main。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/image" android:layout_width="300dp" android:layout_height="300dp" android:src="@mipmap/ic_launcher" /> <Button android:id="@+id/aaaa" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="拍照" /></LinearLayout>
关于详情参考
Android拍照,相册选择图片以及Android6.0权限管理
androidbitmap压缩方法
0 0
- Android 访问相机拍照的爬坑日记。
- 总结Android调用系统相机拍照遇到的坑
- 【Android】Android相机拍照
- 调用Android相机拍照的问题
- android中调用系统相机拍照并访问本地相册
- android相机拍照
- android相机拍照源码
- Android中相机拍照
- Android相机拍照,储存
- android相机camera拍照
- android打开相机拍照
- android自定义相机拍照
- 使用android内置相机拍照
- android之系统相机拍照
- android 调用相机拍照 伪闪退
- android 调用系统相机拍照
- android调用系统相机拍照
- android调用系统相机拍照
- Hadoop集群之HDFS伪分布式安装 HA(二)
- 神炎皇
- 任意进制转换(c++)
- 标准论文参考文献添加方法——Zotero入门使用教程
- 为什么要用translate3d(为了视觉需要,但是会影响css性能)
- Android 访问相机拍照的爬坑日记。
- Android学习篇:TextView用法
- AngularJS Eclipse——新手入门【翻译+整理】
- python小知识点
- Java中hashCode和equals的区别
- Android学习笔记(十九):Mac版as运行虚拟机提示/dev/kvm not found
- 第十五周项目—判断回文数
- 与RxJava的第一次接触
- 通过监听器实现单点登录