Android调用系统图片裁剪限定尺寸及7.0照相问题的解决方法

本文实例为大家分享了Android调用系统图片裁剪限定尺寸及7.0照相问题的解决方法,供大家参考,具体内容如下

内容:手机系统的裁剪介绍,7.0调用相机崩溃解决

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context="com.example.leixiansheng.cutphoto.MainActivity">

  <Button
    android:id="@+id/btn_select_from_local"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="cut"/>

  <ImageView
    android:id="@+id/iv_local"
    android:layout_gravity="center_horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</LinearLayout>

java:

package com.example.leixiansheng.cutphoto;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

 @BindView(R.id.btn_select_from_local)
 Button mBtnSelectFromLocal;
 @BindView(R.id.btn_take_photo)
 Button mBtnTake;
 @BindView(R.id.iv_local)
 ImageView mIvLocal;

 private static final String TAG = MainActivity.class.getSimpleName();
 private static final String IMAGE_FILE_LOCATION = "file:///" + Environment.getExternalStorageDirectory().getPath() + "/temp.jpg";
 private static final int CHOOSE_PICTURE = 1;
 private static final int CROP_PICTURE = 2;
 private static final int REQUEST_CODE_OK = 3;
 private static final int TAKE_PHOTO = 4;

 private Uri imageUri = Uri.parse(IMAGE_FILE_LOCATION);
 private PermissionListener mListener;

 @SuppressLint("NewApi")
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 ButterKnife.bind(this);
 // android 7.0系统解决拍照的问题
 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
 StrictMode.setVmPolicy(builder.build());
 builder.detectFileUriExposure();
 }

 @OnClick({R.id.btn_select_from_local, R.id.btn_take_photo})
 public void onClick(final View view) {
 requestRunTimePermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,
  Manifest.permission.CAMERA}, new PermissionListener() {
  @Override
  public void onGranted() {
  switch (view.getId()) {
   case R.id.btn_select_from_local:
   selectFromLocal();
   break;
   case R.id.btn_take_photo:
   takePhoto();
   break;
  }
  }

  @Override
  public void onDenied(List<String> deniedPermission) {
  Toast.makeText(MainActivity.this, "权限不足", Toast.LENGTH_SHORT).show();
  }
 });
 }

 /**
 * 启动系相机
 */
 private void takePhoto() {
 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
 //启动相机(带返回结果)
 startActivityForResult(intent, TAKE_PHOTO);
 }

 /**
 * 启动系统图片选择
 */
 private void selectFromLocal() {
 Intent intent = new Intent(Intent.ACTION_PICK, null);
 intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); //返回数据为被选照片的Uri
 startActivityForResult(intent, CHOOSE_PICTURE);
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 Log.d(TAG, resultCode + "");
 if (resultCode == RESULT_OK) {
  switch (requestCode) {
  case CHOOSE_PICTURE:
   startPhotoZoom(data.getData());
   break;
  case CROP_PICTURE: // 取得裁剪后的图片
   try {
   mIvLocal.setImageBitmap(BitmapFactory.decodeStream( getContentResolver().openInputStream(imageUri) ));
   } catch (FileNotFoundException e) {
   e.printStackTrace();
   }
   break;
  case TAKE_PHOTO:
   startPhotoZoom(imageUri);
   break;
  default:
   break;
  }
 }
 }

 /**
 * 设置裁剪参数,开始裁剪
 * @param uri
 */
 public void startPhotoZoom(Uri uri) {
 Intent intent = new Intent("com.android.camera.action.CROP");
 intent.setDataAndType(uri, "image/*");
 // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
 intent.putExtra("crop", "true");
 intent.putExtra("scale", true);

 intent.putExtra("aspectX", 2); //裁剪框 X 比值
 intent.putExtra("aspectY", 1); //裁剪框 Y 比值

 intent.putExtra("outputX", 600); //裁剪后输出宽度
 intent.putExtra("outputY", 300); //裁剪后输出高度

 intent.putExtra("return-data", false);
 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //输出路径
 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
 intent.putExtra("noFaceDetection", true); // no face detection

 startActivityForResult(intent, CROP_PICTURE);
 }

 /**
 * 动态权限请求
 *
 * @param permissions
 */
 public void requestRunTimePermission(String[] permissions, PermissionListener listener) {
 mListener = listener;
 List<String> permissionList = new ArrayList<>();
 for (String permission : permissions) {
  if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {//检测当前权限是否已经被允许
  permissionList.add(permission);//没有则添加进集合
  }
 }
 if (!permissionList.isEmpty()) {//检测权限集合中是否有未申请的权限
  ActivityCompat.requestPermissions(this, permissionList.toArray(new String[permissionList.size()]), REQUEST_CODE_OK);
 } else {
  //所有权限都通过了
  mListener.onGranted();
 }
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 switch (requestCode) {
  case REQUEST_CODE_OK:
  if (grantResults.length > 0) {
   List<String> deniedPermission = new ArrayList<>();
   for (int i = 0; i < grantResults.length; i++) {
   int grantResult = grantResults[i];
   String permission = permissions[i];
   if (grantResult != PackageManager.PERMISSION_GRANTED) {
    deniedPermission.add(permission);
   }
   }

   if (!deniedPermission.isEmpty()) {
   mListener.onDenied(deniedPermission);
   } else
   mListener.onGranted();
  }
  break;
  default:
   break;
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android调用系统拍照裁剪图片模糊的解决方法

    在Android中,调用系统相机拍照时,将会接收到返回的图像数据,但是这些图片并不是全尺寸的图像,而是系统给的缩略图,当对拍照的图片进行裁切后显示时,得到的却是模糊的图片.下面针对这个问题提出解决的方法. 首先,我们知道调用系统的裁切是通过Intent intent = new Intent("com.android.camera.action.CROP"); 但是intent到底能够携带哪些数据呢,都有什么含义呢,我们可以看到如下: 上面包含了所有可选的操作,其中有一些非常重要的参数

  • Android编程实现调用系统图库与裁剪图片功能

    本文实例讲述了Android编程实现调用系统图库与裁剪图片功能.分享给大家供大家参考,具体如下: 在Android开发中,调用系统图库和裁剪照片是很常见的需求.相对于自己实现这种功能,直接调用系统具有诸多优点,如不用考虑屏幕适配,不用担心性能问题,等等.因此,对于一般的需求,建议直接调用系统的功能,简便高效! 首先上效果图:    一.只调用系统图库(不裁剪),返回用户选择的图片.(只支持单选,如需多选则需要自己实现,可参考Android编程实现仿QQ照片选择器(按相册分类显示,多选添加)源码.

  • Android裁剪图片为圆形图片的实现原理与代码

    以前在eoe论坛中找过裁剪图片为圆形图片的方法,但是效果都不是很理想,这几天因为公司业务的要求,需要对头像进行裁剪以圆形的方式显示,这个方法是根据传入的图片的高度(height)和宽度(width)决定的,如果是 width <= height时,则会裁剪高度,裁剪的区域是宽度不变高度从顶部到宽度width的长度:如果 width > height,则会裁剪宽度,裁剪的区域是高度不变,宽度是取的图片宽度的中心区域,不过不同的业务需求,对裁剪图片要求不一样,可以根据业务的需求来调整裁剪的区域.

  • Android实现从本地图库/相机拍照后裁剪图片并设置头像

    玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片.上述过程已经实现好了,最后一步我加上了把截取好的图片在保存到本地的操作,来保存头像.为了大家需要,下面我们小编把完整的代码贴出来供大家参考. 先给大家展示效果图: 代码部分: 布局代码(其实就是两个按钮和一个ImageView来显示头像) <LinearLayout xmlns:android="http://schemas.android.co

  • Android 7.0中拍照和图片裁剪适配的问题详解

    前言 Android 7.0系统发布后,拿到能升级的nexus 6P,就开始了7.0的适配.发现在Android 7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些错误: Process: com.yuyh.imgsel, PID: 22995 // 错误1 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.yuyh.imgsel/cache/1486438962645.jpg ex

  • Android实现拍照及图片裁剪(6.0以上权限处理及7.0以上文件管理)

    最近做项目中涉及到了图片相关功能 ,在使用安卓6.0手机及7.1手机拍照时,遇到了因权限及文件管理导致程序崩溃等问题.  刚好把功能修改完,把代码简单地贴一下,方便以后使用. --主界面 代码 -- public class MainActivity extends AppCompatActivity { //拍照按钮 private Button take_photo; //显示裁剪后的图片 private ImageView photo_iv; private static final in

  • Android拍照或从图库选择图片并裁剪

    今天看<第一行代码>上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo. 一. 拍照选择图片 1.使用隐式Intent启动相机 //构建隐式Intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //调用系统相机 startActivityForResult(intent, 1); 2.处理相机拍照返回的结果 //用户点击了取消 if(data == n

  • 解决Android从相册中获取图片出错图片却无法裁剪问题的方法

    在学习获取相册中图片进行裁剪的时候遇到了比较大的问题,在纠结了近半天才真的解决,下面分享一下学习经验. 问题: 选择了相册中的图片之后要进入图片裁剪的时候出错,(华为)手机提示"此图片无法获取",经百度后,明白是版本不同导致的URI的问题的问题,原文如下: 4.3或以下,选了图片之后,根据Uri来做处理,很多帖子都有了,我就不详细说了.主要是4.4,如果使用上面pick的原生方法来选图,返回的uri还是正常的,但如果用ACTION_GET_CONTENT的方法,返回的uri跟4.3是完

  • Android开发从相机或相册获取图片裁剪

    废话不多说了,直接给大家贴代码了. package com.only.android.app; import java.io.File; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.gr

  • Android实现拍照、选择图片并裁剪图片功能

    一. 实现拍照.选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果. 二. uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修改Android-Crop,把定制界面独立出来,让用户去自由设置.下图为使用Android-Crop实现的模仿微信选择图片并裁剪Demo. 三. 实现思路 比较简单的选择设备图片裁剪,并将裁剪后的图片保存到指定路径: 调用系统拍照,将拍照图片保存在SD卡,然后裁剪图

随机推荐