Android Action使用實例

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 ){
       }
    }
    
    
}
相關文章
相關標籤/搜索