Android控制攝像頭拍照并對照片進行裁剪

c6b4 9年前發布 | 2K 次閱讀 Java Android

mainActivity如下:

package cn.testcamera;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity { private Button mButton; private ImageView mImageView; private File mPhotoFile; private String mPhotoPath; private Uri mPhotoOnSDCardUri; public final static int CAMERA_RESULT=777; public final static int CAMERA_RESULT_CUT=888; public final static int CAMERA_RESULT_CUT_OVER=999; public final static String TAG="xx"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button) findViewById(R.id.button); mButton.setOnClickListener(new ButtonOnClickListener()); mImageView = (ImageView) findViewById(R.id.imageView);

}

private class ButtonOnClickListener implements View.OnClickListener {
    public void onClick(View v) {
        try {
            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
            mPhotoPath="mnt/sdcard/DCIM/Camera/"+getPhotoFileName();
            mPhotoFile = new File(mPhotoPath);
            if (!mPhotoFile.exists()) {
                mPhotoFile.createNewFile();
            }
            mPhotoOnSDCardUri=Uri.fromFile(mPhotoFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoOnSDCardUri);
            //拍照后顯示此圖片
            //startActivityForResult(intent,CAMERA_RESULT);
            //拍照后先修改再顯示此圖片
            startActivityForResult(intent,CAMERA_RESULT_CUT);
        } catch (Exception e) {
        }
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //1   拍照后顯示照片
    if (requestCode==CAMERA_RESULT) {
         Bitmap bitmap = BitmapFactory.decodeFile(mPhotoPath, null);  
         mImageView.setImageBitmap(bitmap);
    }
    //2   拍照后剪切照片,然后顯示
    //2.1拍照且剪裁
    if (requestCode == CAMERA_RESULT_CUT) {
        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,mPhotoOnSDCardUri);
        sendBroadcast(intent);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Uri systemImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(systemImageUri, null,
                MediaStore.Images.Media.DISPLAY_NAME + "='"
                        + mPhotoFile.getName() + "'", null, null);
        Uri photoUriInMedia = null;
        if (cursor != null && cursor.getCount() > 0) {
            cursor.moveToLast();
            long id = cursor.getLong(0);
            photoUriInMedia = ContentUris.withAppendedId(systemImageUri, id);
        }
        cursor.close();
        Intent in = new Intent("com.android.camera.action.CROP");
        //需要裁減的圖片格式
        in.setDataAndType(photoUriInMedia, "image/*");
        //允許裁減
        in.putExtra("crop", "true");
        //剪裁后ImageView顯時圖片的寬
        in.putExtra("outputX", 250);
        //剪裁后ImageView顯時圖片的高
        in.putExtra("outputY", 250);
        //設置剪裁框的寬高比例
        in.putExtra("aspectX", 1);
        in.putExtra("aspectY", 1);
        in.putExtra("return-data", true);
        startActivityForResult(in, CAMERA_RESULT_CUT_OVER);
    }
    //2.2顯示
    if (requestCode==CAMERA_RESULT_CUT_OVER) {
        //剪切圖片的時候,若"放棄"則回答的data為null
        if (data!=null) {
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            mImageView.setImageBitmap(bitmap);
        }
    }
}

private String getPhotoFileName() {
    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");
    return dateFormat.format(date) + ".jpg";
}

} </pre>
main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&quot;
    xmlns:tools="http://schemas.android.com/tools&quot;
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<Button
    android:id="@+id/button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="點擊按鈕拍照"
 />
<ImageView 
    android:id="@+id/imageView"
    android:layout_below="@id/button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
 />

</RelativeLayout> </pre>

<manifest xmlns:android="http://schemas.android.com/apk/res/android&quot;
    package="cn.testcamera"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="10" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:launchMode="singleTask"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest></pre>

 本文由用戶 c6b4 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!