日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android: 调用摄像头拍照

發布時間:2023/12/31 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android: 调用摄像头拍照 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很多應用程序都可能會使用到調用攝像頭拍照的功能,比如說程序里需要上傳一張圖片 作為用戶的頭像,這時打開攝像頭拍張照是最簡單快捷的。下面就讓我們通過一個例子來學 習一下,如何才能在應用程序里調用手機的攝像頭進行拍照。

新建一個 ChoosePicTest 項目,然后修改 activity_main.xml 中的代碼,如下所示:

?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"

android:orientation="vertical" >

?

?

<Button android:id="@+id/take_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Take Photo" />

?

<ImageView android:id="@+id/picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" />

?

</LinearLayout>

?

可以看到,布局文件中只有兩個控件,一個 Button 和一個 ImageView。Button 是用于打 開攝像頭進行拍照的,而 ImageView 則是用于將拍到的圖片顯示出來。

然后開始編寫調用攝像頭的具體邏輯,修改 MainActivity 中的代碼,如下所示:

?

public class MainActivity extends Activity { public static final int TAKE_PHOTO = 1; public static final int CROP_PHOTO = 2; private Button takePhoto;

private ImageView picture;

?

?

?

?

private Uri imageUri;

?

?

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

takePhoto = (Button) findViewById(R.id.take_photo);

picture = (ImageView) findViewById(R.id.picture);takePhoto.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 創建File對象,用于存儲拍照后的圖片

File outputImage = new File(Environment. getExternalStorageDirectory(), "tempImage.jpg");

try {

if (outputImage.exists()) {

outputImage.delete();

}

outputImage.createNewFile();

} catch (IOException e) {

e.printStackTrace();

?

?

?

?

?

}

});

}


}

imageUri = Uri.fromFile(outputImage);

Intent intent = new Intent("android.media.action. IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, TAKE_PHOTO); // 啟動相機程序

?

?

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode) {

case TAKE_PHOTO:

if (resultCode == RESULT_OK) {

Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(imageUri, "image/*"); intent.putExtra("scale", true);

?

?

?

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, CROP_PHOTO); // 啟動裁剪程序

}

break;

case CROP_PHOTO:

if (resultCode == RESULT_OK) {

try {

Bitmap bitmap = BitmapFactory.decodeStream

(getContentResolver()

.openInputStream(imageUri));

picture.setImageBitmap(bitmap); // 將裁剪后的照片顯示出來

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

break;

default:

break;

}

}

?

}

上述代碼稍微有點復雜,我們來仔細地分析一下。在 MainActivity 中要做的第一件事自 然是分別獲取到 Button 和 ImageView 的實例,并給 Button 注冊上點擊事件,然后在 Button 的點擊事件里開始處理調用攝像頭的邏輯,我們重點看下這部分代碼。

首先這里創建了一個 File 對象,用于存儲攝像頭拍下的圖片,這里我們把圖片命名為 output_image.jpg , 并 將 它 存 放 在 手 機 SD? 卡 的 根 目 錄 下 , 調 用 Environment 的 getExternalStorageDirectory() 方法獲取到的就是手機 SD 卡的根目錄。然后再調用 Uri 的 fromFile()方法將 File 對象轉換成 Uri 對象,這個 Uri 對象標識著 output_image.jpg 這張圖片 的唯一地址。接著構建出一個 Intent 對象,并將這個 Intent 的 action 指定為 android.media.action. IMAGE_CAPTURE,再調用 Intent 的 putExtra()方法指定圖片的輸出地址,這里填入剛剛得 到的 Uri 對象,最后調用 startActivityForResult()來啟動活動。由于我們使用的是一個隱式 Intent,系統會找出能夠響應這個 Intent 的活動去啟動,這樣照相機程序就會被打開,拍下的 照片將會輸出到 output_image.jpg 中。

注意剛才我們是使用 startActivityForResult()來啟動活動的,因此拍完照后會有結果返回 到 onActivityResult()方法中。如果發現拍照成功,則會再次構建出一個 Intent 對象,并把它 的 action 指定為 com.android.camera.action.CROP。這個 Intent 是用于對拍出的照片進行裁剪的,因為攝像頭拍出的照片都比較大,而我們可能只希望截取其中的一小部分。然后給這個

Intent 設置上一些必要的屬性,并再次調用 startActivityForResult()來啟動裁剪程序。裁剪后 的照片同樣會輸出到 output_image.jpg 中。

裁剪操作完成之后,程序又會回調到 onActivityResult()方法中,這個時候我們就可以調 用 BitmapFactory 的 decodeStream()方法將 output_image.jpg 這張照片解析成 Bitmap 對象,然 后把它設置到 ImageView 中顯示出來。

由于這個項目涉及到了向 SD 卡中寫數據的操作,因此我們還需要在 AndroidManifest.xml中聲明權限:

?

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.choosepictest"

android:versionCode="1" android:versionName="1.0" >

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

……

</manifest>

這樣代碼就都編寫完了,現在將程序運行到手機上,然后點擊 Take Photo 按鈕就可以進 行拍照了,如圖 8.13 所示。

圖? ?8.13

?

拍照完成后點擊確定則可以對照片進行裁剪,如圖 8.14 所示。

?

?

?

?

?

圖? ?8.14

?

點擊完成,就會回到我們程序的界面。同時,裁剪后的照片當然也會顯示出來了,如圖

8.15 所示。

?

?

?

圖? ?8.15

?

總結

以上是生活随笔為你收集整理的android: 调用摄像头拍照的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。