【Android】開啟相機-照相功能與相簿-相片集並讀取相片匯入至程式
infor from : http://dean-android.blogspot.tw/2013/05/android.html
各位Android安卓開發者大家好 ^^ | |
小黑人今天要跟大家分享的是如何"開啟相機"與"開啟相簿"並且將"圖片讀取匯入至程式內",如果各位開發者有接觸到拍照及相簿功能的話,那今天這個主題就會非常的息息相關囉,而且照相這個功能其實可以運用在很多地方,像Google Play上也有許許多多的拍照APP或者是圖片編輯APP,而這些APP都是跟開啟相機進行照相或者是從SD卡讀取相片圖片有關係,今天小黑人就與大家分享如何簡單的將照片匯入至程式內。 | |
1.首先,要開啟相機功能與拍照後將相片存入SD卡內,則需要在AndroidManifest.xml開啟權限,所以我們先在AndroidManifest加入開啟相機權限與寫入SD卡權限 : <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> | |
2.Layout版面配置,小黑人自己先大概排個版面,畫面上有開啟相機Button、開啟相簿Button及顯示匯入照片的ImageView :<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/img" android:layout_width="match_parent" android:layout_height="300dip" /> <Button android:id="@+id/camera" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="開啟相機" android:layout_weight="1" android:layout_gravity="center_vertical" /> <Button android:id="@+id/photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="開啟相簿" android:layout_weight="1" android:layout_gravity="center_vertical" /> </LinearLayout> | |
3.最後就是開啟程式(.java)將各功能寫入啦 :public class MainActivity extends Activity { //宣告 private ImageView mImg; private DisplayMetrics mPhone; private final static int CAMERA = 66 ; private final static int PHOTO = 99 ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //讀取手機解析度 mPhone = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(mPhone); mImg = (ImageView) findViewById(R.id.img); Button mCamera = (Button) findViewById(R.id.camera); Button mPhoto = (Button) findViewById(R.id.photo); mCamera.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //開啟相機功能,並將拍照後的圖片存入SD卡相片集內,須由startActivityForResult且 帶入 requestCode進行呼叫,原因為拍照完畢後返回程式後則呼叫onActivityResult ContentValues value = new ContentValues(); value.put(Media.MIME_TYPE, "image/jpeg"); Uri uri= getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, value); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri.getPath()); startActivityForResult(intent, CAMERA); } }); mPhoto.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //開啟相簿相片集,須由startActivityForResult且帶入requestCode進行呼叫,原因 為點選相片後返回程式呼叫onActivityResult Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, PHOTO); } }); } //拍照完畢或選取圖片後呼叫此函式 @Override protected void onActivityResult(int requestCode, int resultCode,Intent data) { //藉由requestCode判斷是否為開啟相機或開啟相簿而呼叫的,且data不為null if ((requestCode == CAMERA || requestCode == PHOTO ) && data != null) { //取得照片路徑uri Uri uri = data.getData(); ContentResolver cr = this.getContentResolver(); try { //讀取照片,型態為Bitmap Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri)); //判斷照片為橫向或者為直向,並進入ScalePic判斷圖片是否要進行縮放 if(bitmap.getWidth()>bitmap.getHeight())ScalePic(bitmap, mPhone.heightPixels); else ScalePic(bitmap,mPhone.widthPixels); } catch (FileNotFoundException e) { } } super.onActivityResult(requestCode, resultCode, data); } private void ScalePic(Bitmap bitmap,int phone) { //縮放比例預設為1 float mScale = 1 ; //如果圖片寬度大於手機寬度則進行縮放,否則直接將圖片放入ImageView內 if(bitmap.getWidth() > phone ) { //判斷縮放比例 mScale = (float)phone/(float)bitmap.getWidth(); Matrix mMat = new Matrix() ; mMat.setScale(mScale, mScale); Bitmap mScaleBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mMat, false); mImg.setImageBitmap(mScaleBitmap); } else mImg.setImageBitmap(bitmap); } } | |
畫面預覽 : | |
以上就是今天小黑人跟大家分享的內容,照相與相簿的匯入運用,希望大家可以試試看~ ^^ 如有任何問題可以跟小黑人討論交流唷!謝謝大家 XDD | |