選取Android手機多張圖片-使用SAF
SAF(Storage Access Framework)「儲存空間存取架構」,可透過儲存空間供應程式開啟文件、圖片等其他檔案,提供標準UI可讓使用者在各種應用程式和供應程式中,以相同的方式存取檔案。只需幾行程式碼,即可將用戶端應用程式與 SAF 整合。
SAF 內含下列項目:
1.文件供應程式:可顯示儲存服務(storage service)所管理檔案的內容供應程式。Android平台內建數種文件供應程式,例如「下載」、「圖片」和「影片」。
2.用戶端應用程式:可呼叫ACTION_CREATE_DOCUMENT, ACTION_OPEN_DOCUMENT,或ACTION_OPEN_DOCUMENT_TREE接收文件供應程式所傳回檔案。
3.挑選器:讓使用者透過文件供應程式存取文件的系統 UI。
官方網站:Open files using storage access framework(儲存空間存取架構)
文件供應程式挑選器:
使用文件供應程式選取多張圖片步驟如下:
步驟1:使用Intent啟動文件供應程式,並設定選取圖檔setType("image/*"),設定EXTRA_ALLOW_MULTIPLE (Added in API level 18)選取多張。
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
步驟2:呼叫startActivityForResult(),啟動內容供應程式,並等待接收傳回的結果。
startActivityForResult(intent, READ_REQUEST_CODE);
READ_REQUEST_CODE要求代碼,是使用者設定的整數引數,接收Intent結果時,會回傳同一要求代碼,以便識別是哪一個Intent回傳的結果。
步驟3:在onActivityResult()處理回傳結果:
(1)使用getData()處理選取1個檔案
(2)使用getClipData()處理選取多個檔案
設定EXTRA_ALLOW_MULTIPLE為true後,文件供應程式會多"Select all"選項(項目依提供者的服務而定)。
點"Select all"後,圖片會全選,然後依所需去點選或取消圖片,調整完最後按"SELECT",完成選擇多張圖片。使用文件供應程式的優點是不需要自己開發程式,缺點是使用者需要熟悉它的操作,才能實現選擇多張圖片。
練習使用ACTION_OPEN_DOCUMENT選取多張圖片,並顯示在ImageView
在Android Studio新增project(內建設定為"Hello World!"),種類選擇[Empty Activity],組態Minimum API level 選擇[API 29:Andorid 10.0(Q)],完成後,新增一個backgrounds/scenic的ImageView,activity_main.xml參考如下:
<?xml version="1.0" encoding="utf-8"?> <TextView <ImageView </androidx.constraintlayout.widget.ConstraintLayout> |
以ACTION_OPEN_DOCUMENT選擇多張圖片的MainActivity.java如下:
package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); @Override |
執行後會顯示文件供應程式,選擇圖片會以ImageView顯示圖片,但選擇多張圖片,因圖片被更新,只能看到最後一張。
使用MediaStore.Images也可以回傳圖片,但一些APP產生的圖片可能沒放入MediaStore DB,以Device File explorer 在Emulator 上傳的圖片MediaStore也不會回傳,所以未採用此方式。
MediaStore.Images查詢圖片簡單範例如下:
String[] mProjection = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.DISPLAY_NAME }; Cursor mCursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,mProjection,null,null,null); |
使用內容供應程式,以MediaStore選取圖片可參考:選取及複製Android手機圖片-使用MediaStore @ KOEI的旅行
留言列表