Android實(shí)現(xiàn)拍照及圖片顯示效果
本文實(shí)例為大家分享了Android拍照及圖片顯示的具體代碼,供大家參考,具體內(nèi)容如下
1、功能聲明
當(dāng)應(yīng)用需要使用相機(jī)、NFC等外設(shè)時(shí),需要在AndroidManifest.xml中進(jìn)行聲明。
這樣,當(dāng)設(shè)備缺少這些外設(shè)時(shí),應(yīng)用商店的安裝程序可以拒絕安裝設(shè)備。
聲明示例代碼如下:
<uses-feature android:name="android.hardware.camera2"
<!-- required為false時(shí),不強(qiáng)制要求設(shè)備支持該功能 -->
<!-- 如果不設(shè)置該值,一旦設(shè)備不支持camera,就不能安裝該應(yīng)用-->
android:required="false"/>
2、創(chuàng)建指向文件的File對(duì)象
拍攝的照片可以存放到設(shè)備的外部存儲(chǔ)區(qū)。
Android為不同的應(yīng)用分配的獨(dú)有的存儲(chǔ)區(qū)域,同時(shí)按照存儲(chǔ)數(shù)據(jù)的類型對(duì)存儲(chǔ)區(qū)域做了進(jìn)一步地劃分。
設(shè)置照片存儲(chǔ)區(qū)域的代碼示例如下所示:
public File getPhotoFile(Crime crime) {
//獲取應(yīng)用對(duì)應(yīng)的存儲(chǔ)照片的外部存儲(chǔ)路徑
File externalFilesDir = mContext
.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
if (externalFilesDir == null) {
return null;
}
//創(chuàng)建指向文件的File對(duì)象
return new File(externalFilesDir, crime.getPhotoFilename());
}
.............
//每個(gè)crime對(duì)應(yīng)的文件名
public String getPhotoFilename() {
return "IMG_" + getId().toString() + ".jpg";
}
3、觸發(fā)拍照
可以使用MediaStore.ACTION_CAPTURE_IMAGE類型的Intent觸發(fā)拍照,示例代碼如下:
mPhotoButton = (ImageButton) v.findViewById(R.id.crime_camera);
//隱式Intent觸發(fā)相機(jī)拍照
final Intent captureImageIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//mPhotoFile保存著上文創(chuàng)建的指向指定地址的File
//此處判斷是否有能夠處理隱式Intent的組件
boolean canTakePhoto = mPhotoFile != null
&& captureImageIntent.resolveActivity(packageManager) != null;
mPhotoButton.setEnabled(canTakePhoto);
if (canTakePhoto) {
//得到File文件對(duì)應(yīng)的Uri地址
Uri uri = Uri.fromFile(mPhotoFile);
//將Uri地址存入到Intent中,相機(jī)拍照得到的圖像將會(huì)存入到該Uri地址對(duì)應(yīng)的File里
captureImageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
}
mPhotoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivityForResult(captureImageIntent, REQUEST_PHOTO);
}
});
4、處理拍照結(jié)果
拍照完成后,將可以加載得到圖片了。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
.........
} else if (requestCode == REQUEST_PHOTO) {
updatePhotoView();
}
.........
}
private void updatePhotoView() {
if (mPhotoFile == null || !mPhotoFile.exists()) {
mPhotoView.setImageDrawable(null);
} else {
//加載圖片對(duì)應(yīng)的縮略圖
Bitmap bitmap = PictureUtils.getScaledBitmap(mPhotoFile.getPath(), getActivity());
mPhotoView.setImageBitmap(bitmap);
}
}
Bitmap只存儲(chǔ)實(shí)際像素?cái)?shù)據(jù),因此即使原始照片已經(jīng)壓縮過,但存入Bitmap對(duì)象時(shí),文件并不會(huì)被壓縮。
因此加載圖片時(shí),需要先按照給定區(qū)域的大小合理的縮放文件。 然后,用Bitmap加載縮放后的文件,示例代碼如下:
//在具體視圖未加載前,無法得到視圖的實(shí)際大小
//因此根據(jù)屏幕尺寸,使用估算值進(jìn)行縮放
public static Bitmap getScaledBitmap(String path, Activity activity) {
Point size = new Point();
activity.getWindowManager().getDefaultDisplay().getSize(size);
return getScaledBitmap(path, size.x, size.y);
}
public static Bitmap getScaledBitmap(String path, int destWidth, int destHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
//按照正常尺寸解析文件
BitmapFactory.decodeFile(path, options);
//得到原始文件的寬和高
float srcWidth = options.outWidth;
float srcHeight = options.outHeight;
//inSampleSize表示水平/豎直抽樣比
//例如,inSampleSize為2時(shí),水平和數(shù)值均在原始基礎(chǔ)上,每2個(gè)點(diǎn)抽取1個(gè)點(diǎn)
//于是,新圖的大小變?yōu)樵瓉淼?/4
int inSampleSize = 1;
if (srcHeight > destHeight || srcWidth > destWidth) {
if (srcWidth > srcHeight) {
inSampleSize = Math.round(srcHeight / destHeight);
} else {
inSampleSize = Math.round(srcWidth / destWidth);
}
}
options = new BitmapFactory.Options();
options.inSampleSize = inSampleSize;
//按新的抽樣比,重新解析文件
return BitmapFactory.decodeFile(path, options);
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android毛玻璃背景效果簡單實(shí)現(xiàn)代碼
這篇文章主要介紹了Android毛玻璃背景效果簡單實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-08-08
Flutter懸浮按鈕FloatingActionButton使用詳解
本文主要介紹了Flutter懸浮按鈕FloatingActionButton使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07
Android Studio實(shí)現(xiàn)QQ的注冊(cè)登錄和好友列表跳轉(zhuǎn)
最近做了一個(gè)項(xiàng)目,這篇文章主要介紹了Android Studio界面跳轉(zhuǎn),本次項(xiàng)目主要包含了注冊(cè)、登錄和好友列表三個(gè)界面以及之間相互跳轉(zhuǎn),感興趣的可以了解一下2021-05-05
詳解Flutter WebView與JS互相調(diào)用簡易指南
這篇文章主要介紹了詳解Flutter WebView與JS互相調(diào)用簡易指南,分為JS調(diào)用Flutter和Flutter調(diào)用JS,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
Android 自定義閃屏頁廣告倒計(jì)時(shí)view效果
這篇文章主要介紹了Android 自定義閃屏頁廣告倒計(jì)時(shí)view效果,需要的朋友可以參考下2017-05-05
Android中HttpURLConnection與HttpClient的使用與封裝
這篇文章主要介紹了Android中HttpURLConnection與HttpClient的使用以及封裝方法,感興趣的小伙伴們可以參考一下2016-03-03
Android獲取系統(tǒng)儲(chǔ)存以及內(nèi)存信息的方法(一)
這篇文章主要為大家詳細(xì)介紹了Android獲取系統(tǒng)儲(chǔ)存以及內(nèi)存信息的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

