Android根據Action實現一下功能:java
package com.uwo.tools.aibum.local.utils; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import java.io.File; /** * Created by SRain on 2015/12/11. * <p/> * 根據Action實現功能 * 1.拍照 * 2.獲取本地相冊 * 3.剪切圖片 * 4.撥打電話 * 5.掃碼二維碼 */ public class ActionUtils { public static final int GET_IMAGE_FROM_PHONE = 5002; // 獲取相冊返回標識碼 public static final int CROP_IMAGE = 5003; // 剪切返回標識碼 public static final int OPEN_CAMERA_IMAGE_URI = 5100; // 拍照直接返回uri public static final int OPEN_CAMERA_IMAGE_PATH = 5101; // 拍照傳入返回文件路徑 public static final int OPEN_CAMERA_IMAGE_THUMB = 5102; // 拍照返回縮略圖 public static final int OPEN_CAMERA_IMAGE_NO_RESULT = 5103; // 拍照無返回值 public static final int SCAN_QR_CODE = 5104; // 掃碼二維碼 /** * 使用系統相機拍照 * 設置輸出參數,返回Uri * * @param activity */ public static void openCameraImage(final Activity activity) { ImageUriUtils.imageUriFromCamera = ImageUriUtils.createImagePathUri(activity); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUriUtils.imageUriFromCamera); activity.startActivityForResult(intent, OPEN_CAMERA_IMAGE_URI); } /** * 使用系統相機拍照 * 設置輸出參數,返回指定的文件路徑中 * * @param activity * @param path 拍照後文件保存的路徑 */ public static void openCameraImage(final Activity activity, String path) { File file = new File(path); if (!file.exists()) { file = new File(Environment.getExternalStorageDirectory(), path); } Uri uri = Uri.fromFile(file); ImageUriUtils.imageUriFromCamera = ImageUriUtils.createImagePathUri(activity); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); activity.startActivityForResult(intent, OPEN_CAMERA_IMAGE_PATH); } /** * 使用系統相機拍照 * 不設置輸出參數,系統會自動生成一個uri,可是隻會返回一個縮略圖 * <p/> * * @param activity * @return 返回圖片在onActivityResult中經過如下代碼獲取 Bitmap bitmap = (Bitmap) data.getExtras().get("data"); */ public static void openCameraImageThumb(final Activity activity) { ImageUriUtils.imageUriFromCamera = ImageUriUtils.createImagePathUri(activity); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); activity.startActivityForResult(intent, OPEN_CAMERA_IMAGE_THUMB); } /** * 不關心返回結果直接拍照 */ public static void openCameraImageNoResult(final Activity activity) { Intent intent = new Intent(); //調用照相機 intent.setAction("android.media.action.STILL_IMAGE_CAMERA"); activity.startActivity(intent); } /** * 打開本地相冊 * * @param activity */ public static void openLocalImage(final Activity activity) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); activity.startActivityForResult(intent, GET_IMAGE_FROM_PHONE); } /** * 圖片剪裁 * * @param activity * @param srcUri */ public static void cropUriImage(Activity activity, Uri srcUri) { ImageUriUtils.cropImageUri = ImageUriUtils.createImagePathUri(activity); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(srcUri, "image/*"); intent.putExtra("crop", "true"); //////////////////////////////////////////////////////////////// // 1.寬高和比例都不設置時,裁剪框能夠自行調整(比例和大小均可以隨意調整) //////////////////////////////////////////////////////////////// // 2.只設置裁剪框寬高比(aspect)後,裁剪框比例固定不可調整,只能調整大小 //////////////////////////////////////////////////////////////// // 3.裁剪後生成圖片寬高(output)的設置和裁剪框無關,只決定最終生成圖片大小 //////////////////////////////////////////////////////////////// // 4.裁剪框寬高比例(aspect)能夠和裁剪後生成圖片比例(output)不一樣,此時, // 會以裁剪框的寬爲準,按照裁剪寬高比例生成一個圖片,該圖和框選部分可能不一樣, // 不一樣的狀況多是截取框選的一部分,也可能超出框選部分,向下延伸補足 //////////////////////////////////////////////////////////////// // aspectX aspectY 是裁剪框寬高的比例 // intent.putExtra("aspectX", 1); // intent.putExtra("aspectY", 1); // outputX outputY 是裁剪後生成圖片的寬高 // intent.putExtra("outputX", 300); // intent.putExtra("outputY", 100); // return-data爲true時,會直接返回bitmap數據,可是大圖裁剪時會出現問題,推薦下面爲false時的方式 // return-data爲false時,不會返回bitmap,但須要指定一個MediaStore.EXTRA_OUTPUT保存圖片uri Log.e("srcUri", srcUri.toString()); intent.putExtra(MediaStore.EXTRA_OUTPUT, ImageUriUtils.cropImageUri); Log.e("cropImageUri", ImageUriUtils.cropImageUri.toString()); intent.putExtra("return-data", true); activity.startActivityForResult(intent, CROP_IMAGE); } /** * 撥打電話功能 * <uses-permission android:name="android.permission.CALL_PHONE" /> * * @param context * @param phoneNO **/ public static void callPhone(Context context, String phoneNO){ Intent intent = new Intent(Intent.ACTION_DIAL); Uri data = Uri.parse("tel:" + "135xxxxxxxx"); intent.setData(data); context.startActivity(intent); } /** * 掃碼二維碼 * http://blog.csdn.net/jdsjlzx/article/details/43098179 * http://blog.csdn.net/jdsjlzx/article/details/46429043 * http://download.csdn.net/detail/xiaanming/5990219 */ public static void scanQRcode(Activity activity){ Intent intent = new Intent("com.google.zxing.client.android.SCAN" ); activity.startActivityForResult(intent, SCAN_QR_CODE); } }
Activity中重寫onActivityResult()android
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 掃碼返回結果 if (requestCode == ActionUtils.SCAN_QR_CODE) { if ( resultCode == RESULT_OK ){ Bundle bundle = intent.getExtras(); String scanResult = bundle.getString( "result" ); 顯示掃描後的結果 String contents = intent.getStringExtra( "SCAN_RESULT" ); String format = intent.getStringExtra( "SCAN_RESULT_FORMAT" ); app.longToast( "條形碼爲:" + contents + "\n" + "條碼類型爲: " + format + "\n" + "scanResult:" + scanResult + "\n" ); } else if ( resultCode == RESULT_CANCELED ){ } } }