中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android應用中利用系統相機進行拍照的流程是什么

發布時間:2020-12-10 15:48:15 來源:億速云 閱讀:201 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關Android應用中利用系統相機進行拍照的流程是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

調用系統相機步驟

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

<Button
 android:id="@+id/button"
 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:id="@+id/imageView"
 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" />

就是一個按鈕點擊彈起相機,然后一個imageView顯示拍到的照片。

接下來我想一下調用的整個過程我們需要做什么:
首先彈起相機肯定要跳到相機這個應用,那么就必須通過隱性啟動相機的活動。
然后當我們返回應用的時候,還要將照片顯示,所以這里就要用到startActivityForResult這個方法。
其次,我們拍照之后肯定要進行儲存的,那么就涉及到文件的操作。
涉及到內存的操作就肯定要和權限打交道,所有還有權限相關的內容。
最后還有一個問題就是,相機拍完照是要儲存照片的,所以我們要給他一個地址uri,但是可不可以直接把地址當成參數發過去呢?這里就要用到特殊的內容提供器FileProvider。
上面就是調用相機要用到的內容,雖然用的都很淺,但是都會涉及到。接下來看看具體怎么實現。看看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) {

  //創建一個File對象。getExternalCacheDir()獲取應用的緩存目錄,outputImage.jpg是照片名稱
  File outputImage = new File(getExternalCacheDir(),"outputImage.jpg");
  try{  
  //創建一個空文件  
   outputImage.createNewFile();
  }catch (IOException e){
   e.printStackTrace();
  }

  //不同的安卓版本對用不同的獲取Uri的方法
  if (Build.VERSION.SDK_INT>=24){
   imageUri =FileProvider.getUriForFile(MainActivity.this,"huan",outputImage);
  }else{
   imageUri = Uri.fromFile(outputImage);
  }

  //啟動相機的對應Activity
  Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
  intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
  startActivityForResult(intent,1);
  }
 });

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

然后我們再創建一個空的文件夾。這里如果已經有照片了的話例如我們第二次拍照的時候,那么就不會創建新的空文件夾了。直到儲存的時候才會被替換掉。

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

再通過隱式啟動相機activity可以打開相機了。這里系統相機的action是android.media.action.IMAGE_CAPTURE,相機儲存路徑的參數名字是MediaStore.EXTRA_OUTPUT,并把uri傳輸進去。

好了這樣就完成了拍照并把照片儲存的步驟了。接下來還差什么?對了,把照片顯示出來。現在在內存中已經有這個照片了,而且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來啟動活動的,所以就要重寫這個方法來顯示圖片了。這里首先判斷是哪個啟動命令,然后再判斷是否成功啟動,再BitmapFactory.decodeStream這個方法來獲取bitmap,再把bitmap顯示出來就行了。BitmapFactory.decodeStream這個方法需要一個流,可以通過getContentResolver().openInputStream這個方法來開啟一個流。

到此整個流程就解決了。

FileProvider

FileProvider是一個特殊的內容提供器,可以把一個file開頭的uri改成content開頭的,例如:file://uri -> content://uri。那為什么要這么做呢?這里簡單講一下:
這個是因為在Android 7.0之后,官方禁止直接把一個真實路徑的uri傳輸到別的應用,而我們要把地址送給相機,所以就會出現問題了。詳細可以查閱這篇博客:Android 7.0 行為變更 通過FileProvider在應用間共享文件吧

既然是內容提供器那么肯定是要進行注冊的:

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

<&#63;xml version="1.0" encoding="utf-8"&#63;>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
 <external-path
 name="my_image"
 path="/"/>
</paths>

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

上述就是小編為大家分享的Android應用中利用系統相機進行拍照的流程是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

环江| 新竹市| 基隆市| 兴海县| 西藏| 和政县| 伊川县| 侯马市| 赫章县| 太湖县| 子洲县| 长治县| 西平县| 宜良县| 满洲里市| 肥西县| 诏安县| 德阳市| 黔江区| 泸定县| 宁阳县| 嵊泗县| 中阳县| 宽城| 广汉市| 龙泉市| 竹北市| 浠水县| 泰州市| 社会| 邵东县| 依安县| 富平县| 松溪县| 沈丘县| 土默特左旗| 宁南县| 军事| 长阳| 右玉县| 铜鼓县|