標籤:
經常使用到本地圖片的擷取,還有錄音之類,所以就稍微整理了一下,模式都是差不多的,大家可以參考一下。
這裡寫代碼片package com.ly.day72_camera;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 拍照
* 從相簿擷取圖片
* 錄音
* 攝像
*/
public class MainActivity extends AppCompatActivity {
ImageView img;
public static final int TAKE_PHOTO = 1;//拍照後的結果
public static final int RESULT_PHOTO = 2;//裁剪後的結果
public static final int GET_PHOTO = 3;//相簿擷取的結果
public static final int GET_VOICE_CAMERA = 4;//擷取錄音的結果
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img = (ImageView) findViewById(R.id.img);}/** * 按鈕事件的處理 * * @param view */public void btnClick(View view) { switch (view.getId()) { case R.id.btnTakePhoto: //拍照 takePhoto(); break; case R.id.btnGetPhoto://從相簿擷取 getPhoto(); break; case R.id.btnGetVoice://擷取錄音 getVoice(); break; case R.id.btnGetVideo://擷取攝像 getVideo(); break; }}/** * 擷取錄影 */private void getVideo() { Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);//品質 0無損 startActivityForResult(intent, GET_VOICE_CAMERA);}/** * 擷取系統錄音 */private void getVoice() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("audio/amr"); intent.setClassName("com.android.soundrecorder", "com.android.soundrecorder.SoundRecorder"); startActivityForResult(intent, GET_VOICE_CAMERA);}/** * 擷取從相簿圖片 */private void getPhoto() { Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");//查詢類型 startActivityForResult(intent, GET_PHOTO);}/** * 拍照 */private void takePhoto() { //開啟相機的Action Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //該參數是拍照以後儲存的路徑 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "tmp.jpg"))); startActivityForResult(intent, TAKE_PHOTO);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case TAKE_PHOTO://拍照返回的回呼函數 File file = new File(Environment.getExternalStorageDirectory(), "tmp.jpg"); Log.i("info", "----------" + file.getPath()); startZoom(Uri.fromFile(file)); break; case RESULT_PHOTO://裁剪過後的圖片傳回值 Bundle bundle = data.getExtras(); Bitmap bitmap = bundle.getParcelable("data"); //擷取返回的圖片 try { //儲存到本地 FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory() + "/tmp1.jpg"); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); img.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } break; case GET_PHOTO://相簿裡面擷取圖片 startZoom(data.getData()); break; case GET_VOICE_CAMERA://擷取錄音,或者攝像(因為處理方式相同) Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null); while (cursor.moveToNext()) { //擷取錄音或者視頻的儲存路徑 String path = cursor.getString(cursor.getColumnIndex("_data")); Toast.makeText(MainActivity.this, path, Toast.LENGTH_SHORT).show(); } break; }}/** * 裁剪圖片 * * @param uri */private void startZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP");//開啟要裁剪的頁面 intent.setDataAndType(uri, "image/*");//裁剪的圖片,和圖片類型 intent.putExtra("aspectX", 1); //表示裁剪圖片的寬高比例 intent.putExtra("aspectY", 1); //表示裁剪圖片的寬高比例 intent.putExtra("outputX", 300);//表示裁剪出來縮圖的寬高 intent.putExtra("outputY", 300);//表示裁剪出來縮圖的寬高 intent.putExtra("crop", true);//表示是否需要裁剪 intent.putExtra("return-data", true);//表示返回裁剪後的圖片 startActivityForResult(intent, RESULT_PHOTO);}/** * 擷取圖片路徑 * * @param originalUri * @return */private String getPath(Uri originalUri) { String[] proj = {MediaStore.Images.Media.DATA}; //android多媒體資料庫的封裝介面 Cursor cursor = getContentResolver().query(originalUri, proj, null, null, null); //按我個人理解 這個是獲得使用者選擇的圖片的索引值 int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); //將游標移至開頭 ,這個很重要,不小心很容易引起越界 cursor.moveToFirst(); //最後根據索引值擷取圖片路徑 String path = cursor.getString(column_index); return path;}
}
Android中本地圖片資源以及視頻錄音資源的擷取