日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android使用系統(tǒng)相機(jī)進(jìn)行拍照的步驟

瀏覽:15日期:2022-09-21 14:34:06
前言

我們在日常的開發(fā)中有時(shí)候會(huì)遇到需要用到相機(jī)的需求,而相機(jī)也是很常用的東西,例如掃二維碼啊拍照上傳啊等等。這里我不講像qq那樣自定義很強(qiáng)的拍照功能(事實(shí)上我也不會(huì)),講個(gè)最簡單的調(diào)用系統(tǒng)相機(jī)拍照并儲(chǔ)存

調(diào)用系統(tǒng)相機(jī)步驟

這里我通過一個(gè)簡單的例子來講這個(gè)內(nèi)容。我自己寫了一個(gè)demo,布局很簡單:

<Button android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_marginTop='4dp' android:text='take phone' app:layout_constraintEnd_toEndOf='parent' app:layout_constraintHorizontal_bias='0.281' app:layout_constraintStart_toStartOf='parent' app:layout_constraintTop_toTopOf='parent' /> <ImageView android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_marginTop='29dp' app:layout_constraintEnd_toEndOf='parent' app:layout_constraintStart_toStartOf='parent' app:layout_constraintTop_toBottomOf='@+id/button' app:srcCompat='@mipmap/ic_launcher_round' />

就是一個(gè)按鈕點(diǎn)擊彈起相機(jī),然后一個(gè)imageView顯示拍到的照片。

接下來我想一下調(diào)用的整個(gè)過程我們需要做什么:首先彈起相機(jī)肯定要跳到相機(jī)這個(gè)應(yīng)用,那么就必須通過隱性啟動(dòng)相機(jī)的活動(dòng)。然后當(dāng)我們返回應(yīng)用的時(shí)候,還要將照片顯示,所以這里就要用到startActivityForResult這個(gè)方法。其次,我們拍照之后肯定要進(jìn)行儲(chǔ)存的,那么就涉及到文件的操作。涉及到內(nèi)存的操作就肯定要和權(quán)限打交道,所有還有權(quán)限相關(guān)的內(nèi)容。最后還有一個(gè)問題就是,相機(jī)拍完照是要儲(chǔ)存照片的,所以我們要給他一個(gè)地址uri,但是可不可以直接把地址當(dāng)成參數(shù)發(fā)過去呢?這里就要用到特殊的內(nèi)容提供器FileProvider。上面就是調(diào)用相機(jī)要用到的內(nèi)容,雖然用的都很淺,但是都會(huì)涉及到。接下來看看具體怎么實(shí)現(xiàn)。看看Activity中的onCreate的代碼:

private Uri imageUri; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //創(chuàng)建一個(gè)File對(duì)象。getExternalCacheDir()獲取應(yīng)用的緩存目錄,outputImage.jpg是照片名稱 File outputImage = new File(getExternalCacheDir(),'outputImage.jpg'); try{ //創(chuàng)建一個(gè)空文件 outputImage.createNewFile(); }catch (IOException e){ e.printStackTrace(); } //不同的安卓版本對(duì)用不同的獲取Uri的方法 if (Build.VERSION.SDK_INT>=24){ imageUri =FileProvider.getUriForFile(MainActivity.this,'huan',outputImage); }else{ imageUri = Uri.fromFile(outputImage); } //啟動(dòng)相機(jī)的對(duì)應(yīng)Activity Intent intent = new Intent('android.media.action.IMAGE_CAPTURE'); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); startActivityForResult(intent,1); } });

我們來看看這里的代碼:前面的代碼很簡單就是控件的初始化。我們知道照片是要放文件夾得,所以這里要?jiǎng)?chuàng)建一個(gè)File對(duì)象,指定文件的路徑以及名字。這里路徑為什么要用getExternalCacheDir()呢?因?yàn)槊總€(gè)應(yīng)用都有對(duì)應(yīng)得緩存目錄,訪問這些目錄得時(shí)候不用訪問內(nèi)存權(quán)限,這樣得話就可以省去需求權(quán)限得步驟啦。這個(gè)目錄在/scare/Android/data//cache。

然后我們再創(chuàng)建一個(gè)空的文件夾。這里如果已經(jīng)有照片了的話例如我們第二次拍照的時(shí)候,那么就不會(huì)創(chuàng)建新的空文件夾了。直到儲(chǔ)存的時(shí)候才會(huì)被替換掉。

然后我們剛才講到,拍到的圖片要在我們的應(yīng)用中展示,那么就必須用到內(nèi)容提供器。這里用到FileProvider來獲取uri,關(guān)于provider我在下文有講到可以如果是低于4.4版本的安卓就用Uri.fromFile(outputImage);方法可以獲取到uri

再通過隱式啟動(dòng)相機(jī)activity可以打開相機(jī)了。這里系統(tǒng)相機(jī)的action是android.media.action.IMAGE_CAPTURE,相機(jī)儲(chǔ)存路徑的參數(shù)名字是MediaStore.EXTRA_OUTPUT,并把uri傳輸進(jìn)去。

好了這樣就完成了拍照并把照片儲(chǔ)存的步驟了。接下來還差什么?對(duì)了,把照片顯示出來。現(xiàn)在在內(nèi)存中已經(jīng)有這個(gè)照片了,而且uri也知道,所以就很容易了,看代碼:

@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == 1) { if (resultCode == RESULT_OK) try { Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } }

我們剛才使用startActivityForResult來啟動(dòng)活動(dòng)的,所以就要重寫這個(gè)方法來顯示圖片了。這里首先判斷是哪個(gè)啟動(dòng)命令,然后再判斷是否成功啟動(dòng),再BitmapFactory.decodeStream這個(gè)方法來獲取bitmap,再把bitmap顯示出來就行了。BitmapFactory.decodeStream這個(gè)方法需要一個(gè)流,可以通過getContentResolver().openInputStream這個(gè)方法來開啟一個(gè)流。

到此整個(gè)流程就解決了。

FileProvider

FileProvider是一個(gè)特殊的內(nèi)容提供器,可以把一個(gè)file開頭的uri改成content開頭的,例如:file://uri -> content://uri。那為什么要這么做呢?這里簡單講一下:這個(gè)是因?yàn)樵贏ndroid 7.0之后,官方禁止直接把一個(gè)真實(shí)路徑的uri傳輸?shù)絼e的應(yīng)用,而我們要把地址送給相機(jī),所以就會(huì)出現(xiàn)問題了。詳細(xì)可以查閱這篇博客:Android 7.0 行為變更 通過FileProvider在應(yīng)用間共享文件吧

既然是內(nèi)容提供器那么肯定是要進(jìn)行注冊的:

<provider android:name='android.support.v4.content.FileProvider' android:authorities='huan' android:exported='false' android:grantUriPermissions='true'> <meta-data android:name='android.support.FILE_PROVIDER_PATHS' android:resource='@xml/file_paths' /> </provider>

這里的authorities參數(shù)必須和前面的getUriForFile方法的第二個(gè)參數(shù)保持一致,同個(gè)內(nèi)容提供器的authorities肯定要一樣啦。grantUriPermissions參數(shù)一定要是true,這個(gè)的大概意思就是給他的所有元素授權(quán)可以被訪問,在FileProvider中這個(gè)參數(shù)必須是true(這也是為什么在4.4一下版本的安卓無法使用的原因之一,有興趣可以去了解一下)export這個(gè)參數(shù)表示可不可以給其他的應(yīng)用共享,這里要設(shè)置為false。<meta-data這個(gè)是配置我們可以訪問的文件路徑,@xml/file_paths這個(gè)就是表示什么文件可以被訪問,當(dāng)然要建一個(gè)這個(gè)文件。看代碼:

<?xml version='1.0' encoding='utf-8'?><paths xmlns:android='http://schemas.android.com/apk/res/android'> <external-path name='my_image' path='/'/></paths>

<external-path這個(gè)就是表示可以被訪問的路徑,name是后面映射用到的,可以自己隨便起,我這里用一橫桿表示整個(gè)目錄可以被訪問。

小結(jié)

調(diào)用系統(tǒng)相機(jī)的功能雖然不難,代碼也不多,但是其中的零碎知識(shí)很多,零零散散,還是要注意的。特別是關(guān)于低高配的安卓版本問題還是要特別注意一下。

以上就是Android使用系統(tǒng)相機(jī)進(jìn)行拍照的步驟的詳細(xì)內(nèi)容,更多關(guān)于Android 適用系統(tǒng)相機(jī)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
少妇精品久久久一区二区| 蜜臀av亚洲一区中文字幕| 蜜桃伊人久久| 首页国产欧美日韩丝袜| 亚洲欧美日韩综合国产aⅴ| 欧美日韩精品一本二本三本| 一区视频在线| 一区二区三区四区在线观看国产日韩| 亚洲欧美视频一区二区三区| 视频一区二区中文字幕| 日本亚洲不卡| 日本欧美一区| 精品国产不卡| 999久久久亚洲| 亚洲精品成人一区| 欧美自拍一区| 国产中文字幕一区二区三区| 亚洲精品**中文毛片| аⅴ资源天堂资源库在线| 亚洲午夜黄色| 日韩福利在线观看| 欧美aⅴ一区二区三区视频| 麻豆国产欧美一区二区三区| 欧美韩日一区| 好吊一区二区三区| 国产日韩欧美三区| 精品国产亚洲一区二区三区大结局| 成人国产精选| 夜夜精品视频| 精品国产网站| 日韩在线电影| 99精品视频在线| 国产精品网站在线看| 欧洲在线一区| 国产精品xvideos88| 一区在线免费观看| 精品视频自拍| 亚洲欧洲美洲国产香蕉| 国产aⅴ精品一区二区三区久久| 91九色精品| 免费在线亚洲欧美| 宅男噜噜噜66国产日韩在线观看| 欧美精品三级在线| 国产精品毛片在线| 日韩毛片在线| 欧美一区激情| 天堂va欧美ⅴa亚洲va一国产| 久久免费高清| 精品精品国产三级a∨在线| 亚洲一区二区av| 欧美丝袜一区| 福利一区二区三区视频在线观看| 婷婷亚洲精品| 99riav1国产精品视频| 日韩免费高清| а√天堂8资源在线| 国产剧情一区| 国产欧美亚洲一区| 国产亚洲字幕| 久久精品99国产精品| 国产欧美久久一区二区三区| 久久国产欧美日韩精品| 欧美一区网站| 免费视频一区二区三区在线观看| 国产伦精品一区二区三区视频 | 久久国产精品毛片| 欧美日韩精品一本二本三本| 久久精品青草| 999在线观看精品免费不卡网站| 久久蜜桃av| 中文亚洲欧美| 日韩精品视频在线看| 欧美日韩黄网站| 国产成人精品免费视| 九色porny丨国产首页在线| 国产v综合v| 天堂成人免费av电影一区| 亚洲精品在线a| 国产精品白丝久久av网站 | 成人精品天堂一区二区三区| 久久精品99久久无色码中文字幕| 怡红院精品视频在线观看极品| 日韩制服丝袜av| 欧美视频久久| 成人久久一区| 亚洲精品黄色| 国产精品magnet| 丝袜美腿一区| 亚洲欧美日韩精品一区二区| 日韩精品中文字幕一区二区| 麻豆一区二区99久久久久| 国产综合精品| 欧美亚洲网站| 久久精选视频| 国产精品色网| 高清久久精品| 日韩欧乱色一区二区三区在线| 精品国产三区在线| 国产精品毛片在线| 电影91久久久| 日韩二区在线观看| 欧美日韩国产探花| 国产91在线精品| 日韩福利视频导航| 好吊日精品视频| 国产一区二区精品久| 亚洲精品第一| 国产一区导航| 久久久9色精品国产一区二区三区| 美女91精品| 久久精品国产www456c0m| 精品视频在线观看网站| 日韩欧美中文字幕在线视频| 性欧美xxxx免费岛国不卡电影| 久久不卡国产精品一区二区| 日韩一区二区三区在线看| 激情婷婷欧美| 999久久久精品国产| 国产欧美一区二区三区精品酒店 | 在线亚洲人成| 国产一区二区三区四区| 日本aⅴ精品一区二区三区| 99在线精品视频在线观看| 久久亚洲国产| 欧美日韩国产一区二区三区不卡 | 亚洲精品一级| 无码日韩精品一区二区免费| 一区二区亚洲精品| 欧美成人久久| 亚洲四虎影院| 激情久久久久久| 婷婷激情综合| 日韩专区欧美专区| 视频在线观看一区| 日韩精品中文字幕吗一区二区 | 激情久久99| 88xx成人免费观看视频库| 日韩国产欧美| 久久蜜桃资源一区二区老牛| 九九在线精品| 亚洲在线一区| 亚洲精品免费观看| 日韩av中文字幕一区| 国产欧美日韩一级| 国产精品宾馆| 免费看av不卡| 亚洲乱码久久| 久久香蕉网站| 国产亚洲综合精品| 国产欧美日韩亚洲一区二区三区| 精品五月天堂| 午夜久久tv| 欧美日本久久| 欧美成人基地| 日韩精彩视频在线观看| 欧美好骚综合网| 日韩视频二区| 国产精品久久久久77777丨| 91看片一区| 日韩精品免费一区二区夜夜嗨| 久久久精品国产**网站| 制服诱惑一区二区| 国产精品自在| 女主播福利一区| 国内精品伊人| 日韩精品一页| 婷婷综合五月| 久久久久久夜| 欧美成人一二区| 日韩影片在线观看| 亚洲黄页一区| 亚洲成人av观看| 黄色欧美在线| 国产精品伊人| 美女网站久久| 中文另类视频| 国产在线看片免费视频在线观看| 日韩av资源网| 中文字幕日韩高清在线| 国精品一区二区| 日本久久成人网| 国产不卡人人| 在线看片福利| 国产成人精品三级高清久久91| 欧美视频精品全部免费观看| 日韩中文av| 国产日韩中文在线中文字幕| 综合激情在线| 日本伊人久久| 婷婷综合一区| 午夜精品影视国产一区在线麻豆| 9久re热视频在线精品| 欧美 日韩 国产一区二区在线视频| 日韩精品看片| 在线一区欧美| 婷婷久久免费视频| 国产亚洲高清一区| 免费亚洲婷婷| 成人免费网站www网站高清| 久久一级电影|