打开系统相册裁剪图片,已解决裁剪大图的问题

<span style="font-size:18px;">关于调用系统裁剪图片的问题,好不容易终于解决了!</span>
<span style="font-size:18px;">1.先看看一些基本的参数</span>
<span style="font-size:18px;">裁剪大图的时候一定用imageUri进行传递,intent.putExtra("output", imageUri);</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">如果intent.putExtra("return-data", true);</span>
<span style="font-size:18px;">这里设置为true 就代表用bitmap传递,一旦bitmap超过1m就崩溃。</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">scs</span>
<span style="font-size:18px;">Intent intent = new Intent(Intent.ACTION_PICK);
						intent.setType("image/*");
						imageUri = 
								Uri.parse(IMAGE_FILE_LOCATION);
						intent.putExtra("output", imageUri);
						startActivityForResult(intent, 102);</span>

裁剪的方法

<span style="font-size:18px;">private void crop(Uri url) {
		try {
		Intent intent = new Intent();
		intent.setAction("com.android.camera.action.CROP");
		if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
			String urls = getPath(context, url);
			url = Uri.fromFile(new File(urls));
			Log.e("url1", ""+url);
		}
		intent.putExtra("crop", "true");
		intent.setDataAndType(url, "image/*");
		// aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪图片宽高
		intent.putExtra("outputX", 200);
		intent.putExtra("outputY", 200);
		intent.putExtra("output", imageUri);
		//intent.putExtra("scale", true);//是否保存比例
		//intent.putExtra("scaleUpIfNeeded", false);// 如果小于要求输出大小,就放大
		intent.putExtra("noFaceDetection", true);// 关闭人脸识别
		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
		intent.putExtra("return-data", false);
		startActivityForResult(intent, 103);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}</span>

在onactivityforsuft里保存图片

<span style="font-size:18px;">	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if(resultCode!=Activity.RESULT_OK)return;
		if(resultCode == 100){
			byte[] bt = data.getByteArrayExtra("bitmap");
			if(bt!=null){
				try {
					bp = BitmapFactory.decodeByteArray(bt, 0, bt.length);
					time = System.currentTimeMillis();
					s = String.valueOf(time);
					
					Tools.writeToSdcard(context, path
							, s+".png", bt);
				} catch (IOException e) {
					e.printStackTrace();
				}
				
				upPicture(path+s+".png");
			}
				/*Bitmap bp = BitmapFactory.decodeByteArray(bt, 0, bt.length);
				tv_head.setImageBitmap(bp);
			*/
		}
		if(requestCode == 102&&resultCode == context.RESULT_OK){
			if(data==null)return;
			if(data!=null){	
				url2 = data.getData();
				/*Intent intent = new Intent(context, CropActivity.class);
				intent.putExtra("url", url2);
				startActivityForResult(intent, 100);*/
				crop(url2);
				
			}
		}
		if(requestCode == 103&&resultCode == context.RESULT_OK){
			Log.e("imageUri", ""+imageUri);
		//	bitmap2 = data.getParcelableExtra("data");
			try {
				 bitmap2 = MediaStore.Images.Media.getBitmap(context.getContentResolver(), imageUri);
				 if(bitmap2==null)return;
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			ByteArrayOutputStream bao = new ByteArrayOutputStream();
			bitmap2.compress(Bitmap.CompressFormat.JPEG, 100, bao);
			bytes2 = bao.toByteArray();
			
			Base64.encodeToString(bytes2, Base64.DEFAULT);
			try {
				time = System.currentTimeMillis();
</span><div style="text-align: center;"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">	}</span></span></span></div><span style="font-size:18px;">				s = String.valueOf(time);
				
				Tools.writeToSdcard(context, path
						, s+".png", bytes2);
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
</span>
<span style="font-size:18px;">下面的方法是把裁剪的图片保存起来,一定要加上.(代码就不上传了)</span>
<span style="font-size:18px;">Tools.writeToSdcard(context, path
						, s+".png", bytes2);</span>

	<span style="font-size:18px;">// 以下是关键,原本uri返回的是file:///...来着的,android4.4返回的是content:///...
	@SuppressLint("NewApi")
	public static String getPath(final Context context, final Uri uri) {
		// DocumentProvider
		if (DocumentsContract.isDocumentUri(context, uri)) {
			// ExternalStorageProvider
			if (isExternalStorageDocument(uri)) {
				final String docId = DocumentsContract.getDocumentId(uri);
				final String[] split = docId.split(":");
				final String type = split[0];
				if ("primary".equalsIgnoreCase(type)) {
					return Environment.getExternalStorageDirectory() + "/" + split[1];
				}
			}
			// DownloadsProvider
			else if (isDownloadsDocument(uri)) {
				final String id = DocumentsContract.getDocumentId(uri);
				final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
						Long.valueOf(id));
				return getDataColumn(context, contentUri, null, null);
			}
			// MediaProvider
			else if (isMediaDocument(uri)) {
				final String docId = DocumentsContract.getDocumentId(uri);
				final String[] split = docId.split(":");
				final String type = split[0];
				Uri contentUri = null;
				if ("image".equals(type)) {
					contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
				} else if ("video".equals(type)) {
					contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
				} else if ("audio".equals(type)) {
					contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
				}
				final String selection = "_id=?";
				final String[] selectionArgs = new String[] { split[1] };
				return getDataColumn(context, contentUri, selection, selectionArgs);
			}
		}
		// MediaStore (and general)
		else if ("content".equalsIgnoreCase(uri.getScheme())) {
			// Return the remote address
			if (isGooglePhotosUri(uri))
				return uri.getLastPathSegment();
			return getDataColumn(context, uri, null, null);
		}
		// File
		else if ("file".equalsIgnoreCase(uri.getScheme())) {
			return uri.getPath();
		}
		return null;
	}
	/**
	 * Get the value of the data column for this Uri. This is useful for
	 * MediaStore Uris, and other file-based ContentProviders.
	 * 
	 * @param context
	 *            The context.
	 * @param uri
	 *            The Uri to query.
	 * @param selection
	 *            (Optional) Filter used in the query.
	 * @param selectionArgs
	 *            (Optional) Selection arguments used in the query.
	 * @return The value of the _data column, which is typically a file path.
	 */
	public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
		Cursor cursor = null;
		final String column = "_data";
		final String[] projection = { column };
		try {
			cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
			if (cursor != null && cursor.moveToFirst()) {
				final int index = cursor.getColumnIndexOrThrow(column);
				return cursor.getString(index);
			}
		} finally {
			if (cursor != null)
				cursor.close();
		}
		return null;
	}
	/**
	 * @param uri
	 *            The Uri to check.
	 * @return Whether the Uri authority is ExternalStorageProvider.
	 */
	public static boolean isExternalStorageDocument(Uri uri) {
		return "com.android.externalstorage.documents".equals(uri.getAuthority());
	}

	/**
	 * @param uri
	 *            The Uri to check.
	 * @return Whether the Uri authority is DownloadsProvider.
	 */
	public static boolean isDownloadsDocument(Uri uri) {
		return "com.android.providers.downloads.documents".equals(uri.getAuthority());
	}

	/**
	 * @param uri
	 *            The Uri to check.
	 * @return Whether the Uri authority is MediaProvider.
	 */
	public static boolean isMediaDocument(Uri uri) {
		return "com.android.providers.media.documents".equals(uri.getAuthority());
	}

	/**
	 * @param uri
	 *            The Uri to check.
	 * @return Whether the Uri authority is Google Photos.
	 */
	public static boolean isGooglePhotosUri(Uri uri) {
		return "com.google.android.apps.photos.content".equals(uri.getAuthority());
	}</span>


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值