照片系列之android呼叫攝像頭拍照
變數
private static final int TAKE_PHOTO=1;
private Button takePhotoBtn,chooseFromAlbumBtn;
private ImageView showImg;
private Uri imageUri;
private String fileurl;
動態獲取呼叫攝像機許可權
android6.0之後拍照許可權屬於危險許可權,需要動態獲取,更多危險許可權:連結 Android 執行時許可權
注意:這個要先把拍照的許可權給了
//在這裡判斷許可權是否授權
if (ContextCompat.checkSelfPermission(PictureAc.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
//如果沒有請求許可權在這裡請求
ActivityCompat.requestPermissions(PictureAc.this,new String[]{Manifest.permission.CAMERA},1);
}else{
if (hasSdcard()) {
openCamera();
}else{
Toast.makeText(PictureAc.this,"沒有SD卡",Toast.LENGTH_LONG).show();
}
}
//這裡接收動態獲取許可權時候的結果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 1:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
if (hasSdcard()) {
openCamera();
}else{
Toast.makeText(PictureAc.this,"沒有SD卡",Toast.LENGTH_LONG).show();
}
}else{
Toast.makeText(this,"您拒絕了該許可權的獲取",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
這裡首先判斷SD卡是否存在
public static boolean hasSdcard() {
return Environment.getExternalStorageState().equals("mounted");
}
呼叫攝像頭
然後呼叫攝像頭
@SuppressLint("WrongConstant")
public void openCamera() {
int currentapiVersion = Build.VERSION.SDK_INT;
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
if (hasSdcard()) {
String pacname = Environment.getExternalStorageDirectory() + "/Pictures/";
File dirFile = new File(pacname);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
fileurl = pacname + "123.jpg";
File filename = new File(this.fileurl);
if (filename.exists()) {
filename.delete();
}
if (currentapiVersion < 24) {
imageUri = Uri.fromFile(new File(this.fileurl));
intent.putExtra("output", imageUri);
} else {
intent.addFlags(1);
imageUri = FileProvider.getUriForFile(this, "aiom.w3studio.apps.android.sdhr.myapplication.fileprovider", new File(this.fileurl));
intent.putExtra("output", imageUri);
}
}
startActivityForResult(intent, TAKE_PHOTO);
}
在這裡面先建立圖片儲存路徑,注意要先把許可權給了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在這裡要特別注意:要判斷路徑是否存在,不存在的時候先建立,因為不同手機是不一樣的,有的手機當路徑不存在的時候會自動建立,但是有的手機不會自動建立,為了相容,最好將路徑建立出來。
在Android7.0系統開始,使用真實本地路徑被認為是不安全的,會丟擲異常,用FileProvider來對資料進行封裝共享給外部,從而提供應用的安全性,第一個引數傳content物件,第二個引數可以是任意的唯一字串,引數三是file物件
拍照回撥
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if (resultCode==RESULT_OK){
Toast.makeText(PictureAc.this,"攝像頭呼叫成功!",Toast.LENGTH_LONG).show();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
//不會載入,只會獲取圖片的一個尺寸
//options裡面儲存了圖片的高度和寬度
//讀取檔案
BitmapFactory.decodeFile(fileurl ,options);
//改變圖片的大小
double ratio = Math.max(options.outWidth *1.0d/1024f,options.outHeight *1.0d/1024);
options.inSampleSize =(int) Math.ceil(ratio);
//設定後會載入圖片
options.inJustDecodeBounds = false;
//圖片壓縮完成
Bitmap bitmap= BitmapFactory.decodeFile(fileurl ,options);
showImg.setImageBitmap(bitmap);
}
break;
default:
break;
}
}
這裡需要注意的是,直接放照片會有顯示不出來的現象,所以要壓縮一下圖片顯示,並且,在指定Uri的情況下data返回的會是空,所以這時候就不要使用data獲取值了
效果展示
相關文章
- Android呼叫攝像頭拍照並顯示照片Android
- Android呼叫攝像頭拍照Android
- Android 呼叫攝像頭拍照Android
- Android開發之呼叫攝像頭拍照Android
- 安卓呼叫攝像頭拍照安卓
- Android 呼叫攝像頭功能【拍照與視訊】Android
- C#實現攝像頭呼叫、拍照C#
- Android提供的攝像頭拍照Android
- Android呼叫攝像頭Android
- html5呼叫攝像頭實現拍照HTML
- android studio之簡單呼叫攝像頭並且獲取其照片Android
- 在Android中呼叫攝像頭拍照並顯示出來Android
- Android如何呼叫攝像頭Android
- 瀏覽器呼叫攝像頭進行拍照程式瀏覽器
- C# 使用AForge呼叫筆記本攝像頭拍照C#筆記
- 安卓開發之呼叫攝像頭安卓
- android studio呼叫攝像頭拍照及具體步驟演示程式碼Android
- web呼叫攝像頭拍照並上傳到伺服器Web伺服器
- 【Android】【opencv】實現攝像頭拍照和錄影AndroidOpenCV
- 純JavaScript實現的呼叫裝置攝像頭並拍照的功能JavaScript
- jQuery webcam plugin呼叫攝像頭jQueryWebPlugin
- Android中呼叫攝像頭拍照儲存,並在相簿中選擇圖片顯示Android
- Android多媒體應用開發-控制攝像頭拍照Android
- html5呼叫攝像頭功能HTML
- AngularJS中使用HTML5攝像頭拍照AngularJSHTML
- android opencv 前置攝像頭AndroidOpenCV
- android 開啟攝像頭Android
- 修正Android攝像頭APIAndroidAPI
- html5呼叫攝像頭截圖HTML
- 教你如何利用python呼叫攝像頭Python
- html5呼叫手機攝像頭HTML
- iPhone XS/iPhone XS Max攝像頭拍照解析:蘋果也玩起了AI拍照iPhone蘋果AI
- html5中呼叫攝像頭拍照並上傳(附繞過https的想法)HTMLHTTP
- android獲得手機照片,攝像,拍照,錄音等功能並將其轉為字串Android字串
- 蘋果攝像頭新專利曝光:提升照片解析度蘋果
- [譯]Android的多攝像頭支援Android
- [譯] Android 的多攝像頭支援Android
- python版opencv:如何用筆記本攝像頭拍照儲存PythonOpenCV筆記