照片系列之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 studio之簡單呼叫攝像頭並且獲取其照片Android
- 在Android中呼叫攝像頭拍照並顯示出來Android
- android studio呼叫攝像頭拍照及具體步驟演示程式碼Android
- 瀏覽器呼叫攝像頭進行拍照程式瀏覽器
- 【Android】【opencv】實現攝像頭拍照和錄影AndroidOpenCV
- web呼叫攝像頭拍照並上傳到伺服器Web伺服器
- UVC攝像頭按鍵拍照功能
- 安卓開發之呼叫攝像頭安卓
- Android中呼叫攝像頭拍照儲存,並在相簿中選擇圖片顯示Android
- 純JavaScript實現的呼叫裝置攝像頭並拍照的功能JavaScript
- jQuery webcam plugin呼叫攝像頭jQueryWebPlugin
- android 開啟攝像頭Android
- android opencv 前置攝像頭AndroidOpenCV
- html5呼叫攝像頭功能HTML
- 教你如何利用python呼叫攝像頭Python
- HTML5如何呼叫攝像頭?HTML
- html5中呼叫攝像頭拍照並上傳(附繞過https的想法)HTMLHTTP
- html5呼叫攝像頭截圖HTML
- [譯]Android的多攝像頭支援Android
- [譯] Android 的多攝像頭支援Android
- iPhone XS/iPhone XS Max攝像頭拍照解析:蘋果也玩起了AI拍照iPhone蘋果AI
- Android CameraX 開啟攝像頭預覽Android
- Android 攝像頭預覽懸浮窗Android
- Android 圓形頭像 相簿和拍照裁剪選取Android
- python版opencv:如何用筆記本攝像頭拍照儲存PythonOpenCV筆記
- matlab呼叫攝像頭並儲存成幀的形式Matlab
- Jetson AGX Xavier ROS下呼叫USB單目攝像頭ROS
- AndroidCamera2拍照(三)——切換攝像頭,延時拍攝和閃光模式Android模式
- 攝像頭操作指南
- 【音影片】攝像頭
- WPF呼叫攝像頭,對圖片相似度識別 1.0
- Ubuntu系統怎麼呼叫攝像頭和麥克風Ubuntu
- 簡單介紹C#呼叫USB攝像頭的方法C#
- ToDesk勾上攝像頭會看到我嗎?如何關閉攝像頭