日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android打开系统文件管理器

發布時間:2023/12/10 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android打开系统文件管理器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

Android 4.4(API級別19)引入了存儲訪問框架(SAF)。
通過SAF,用戶可以輕松地瀏覽和打開所有首選文檔存儲提供商中的文檔,圖像和其他文件。
也就是說,接下來介紹的方式適用于android4.4+的操作系統。
參考鏈接:https://developer.android.com/guide/topics/providers/document-provider

二、詳細實現

1、調出系統文件管理器界面
private static final int READ_REQUEST_CODE = 42; ... /*** Fires an intent to spin up the "file chooser" UI and select an image.*/ public void performFileSearch() {// ACTION_OPEN_DOCUMENT is the intent to choose a file via the system's file// browser.Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);// Filter to only show results that can be "opened", such as a// file (as opposed to a list of contacts or timezones)intent.addCategory(Intent.CATEGORY_OPENABLE);// Filter to show only images, using the image MIME data type.// If one wanted to search for ogg vorbis files, the type would be "audio/ogg".// To search for all documents available via installed storage providers,// it would be "*/*".intent.setType("image/*");startActivityForResult(intent, READ_REQUEST_CODE); }
1)Intent除了可以設置為ACTION_OPEN_DOCUMEN,還可以替換為ACTION_GET_CONTENT ,兩者的區別如下:
  • 如果您希望您的應用僅讀取/導入數據,請使用ACTION_GET_CONTENT。 通過這種方法,應用程序可以導入數據的副本,例如圖像文件。
  • 如果希望您的應用對文件提供者擁有的文件具有長期,持久的訪問權限,請使用ACTION_OPEN_DOCUMENT。
2)Category設置為CATEGORY_OPENABLE,過濾出可以打開的文件
3)Type設置的是MIMETYPE,比如:
  • 過濾所有圖片,則設置為:"image/*"
  • 只過濾png圖片,則設置為:"image/png"
  • 過濾apk,那么可設置為:"application/vnd.android.package-archive"
4)startActivityForResult 啟動Inetent,以便在onActivityResult接收文件選擇結果
2、在onActivityResult中處理返回結果
@Override public void onActivityResult(int requestCode, int resultCode,Intent resultData) {// The ACTION_OPEN_DOCUMENT intent was sent with the request code// READ_REQUEST_CODE. If the request code seen here doesn't match, it's the// response to some other intent, and the code below shouldn't run at all.if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {// The document selected by the user won't be returned in the intent.// Instead, a URI to that document will be contained in the return intent// provided to this method as a parameter.// Pull that URI using resultData.getData().Uri uri = null;if (resultData != null) {uri = resultData.getData();Log.i(TAG, "Uri: " + uri.toString());showImage(uri);}} }
1)從Intent中getData()獲取到返回的Uri對象,舊版本是file://開頭,新版本是content://開頭
3、從Uri獲取所需的信息
1)從Uri中獲取文件元數據,一般只能獲取到文件名與大小
public void dumpImageMetaData(Uri uri) {// The query, since it only applies to a single document, will only return// one row. There's no need to filter, sort, or select fields, since we want// all fields for one document.Cursor cursor = getActivity().getContentResolver().query(uri, null, null, null, null, null);try {// moveToFirst() returns false if the cursor has 0 rows. Very handy for// "if there's anything to look at, look at it" conditionals.if (cursor != null && cursor.moveToFirst()) {// Note it's called "Display Name". This is// provider-specific, and might not necessarily be the file name.String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));Log.i(TAG, "Display Name: " + displayName);int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);// If the size is unknown, the value stored is null. But since an// int can't be null in Java, the behavior is implementation-specific,// which is just a fancy term for "unpredictable". So as// a rule, check if it's null before assigning to an int. This will// happen often: The storage API allows for remote files, whose// size might not be locally known.String size = null;if (!cursor.isNull(sizeIndex)) {// Technically the column stores an int, but cursor.getString()// will do the conversion automatically.size = cursor.getString(sizeIndex);} else {size = "Unknown";}Log.i(TAG, "Size: " + size);}} finally {cursor.close();} }
2)將Uri轉換為Bitmap
private Bitmap getBitmapFromUri(Uri uri) throws IOException {ParcelFileDescriptor parcelFileDescriptor =getContentResolver().openFileDescriptor(uri, "r");FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);parcelFileDescriptor.close();return image; }
3)將Uri轉換為InputStream
private String readTextFromUri(Uri uri) throws IOException {StringBuilder stringBuilder = new StringBuilder();try (InputStream inputStream =getContentResolver().openInputStream(uri);BufferedReader reader = new BufferedReader(new InputStreamReader(Objects.requireNonNull(inputStream)))) {String line;while ((line = reader.readLine()) != null) {stringBuilder.append(line);}}return stringBuilder.toString(); }
MIMETYPE 常見的用法:
文件類型mime名稱文件類型mime名稱
3gpvideo/3gpppdbchemical/x-pdb
aabapplication/x-authoware-binpdfapplication/pdf
aamapplication/x-authoware-mappfrapplication/font-tdpfr
aasapplication/x-authoware-segpgmimage/x-portable-graymap
aiapplication/postscriptpictimage/x-pict
aifaudio/x-aiffpmapplication/x-perl
aifcaudio/x-aiffpmdapplication/x-pmd
aiffaudio/x-aiffpngimage/png
alsaudio/X-Alpha5pnmimage/x-portable-anymap
amcapplication/x-mpegpnzimage/png
aniapplication/octet-streampotapplication/vnd.ms-powerpoint
apkapplication/vnd.android.package-archiveppmimage/x-portable-pixmap
asctext/plainppsapplication/vnd.ms-powerpoint
asdapplication/astoundpptapplication/vnd.ms-powerpoint
asfvideo/x-ms-asfpqfapplication/x-cprplayer
asnapplication/astoundpqiapplication/cprplayer
aspapplication/x-asapprcapplication/x-prc
asxvideo/x-ms-asfproxyapplication/x-ns-proxy-autoconfig
auaudio/basicpsapplication/postscript
avbapplication/octet-streamptlkapplication/listenup
avivideo/x-msvideopubapplication/x-mspublisher
awbaudio/amr-wbpvxvideo/x-pv-pvx
bcpioapplication/x-bcpioqcpaudio/vnd.qcelp
binapplication/octet-streamqtvideo/quicktime
bldapplication/bldqtiimage/x-quicktime
bld2application/bld2qtifimage/x-quicktime
bmpimage/bmpr3ttext/vnd.rn-realtext3d
bpkapplication/octet-streamraaudio/x-pn-realaudio
bz2application/x-bzip2ramaudio/x-pn-realaudio
calimage/x-calsrarapplication/x-rar-compressed
ccnapplication/x-cncrasimage/x-cmu-raster
ccoapplication/x-cocoardfapplication/rdf+xml
cdfapplication/x-netcdfrfimage/vnd.rn-realflash
cgimagnus-internal/cgirgbimage/x-rgb
chatapplication/x-chatrlfapplication/x-richlink
classapplication/octet-streamrmaudio/x-pn-realaudio
clpapplication/x-mscliprmfaudio/x-rmf
cmxapplication/x-cmxrmmaudio/x-pn-realaudio
coapplication/x-cult3d-objectrmvbaudio/x-pn-realaudio
codimage/cis-codrnxapplication/vnd.rn-realplayer
cpioapplication/x-cpioroffapplication/x-troff
cptapplication/mac-compactprorpimage/vnd.rn-realpix
crdapplication/x-mscardfilerpmaudio/x-pn-realaudio-plugin
cshapplication/x-cshrttext/vnd.rn-realtext
csmchemical/x-csmlrtex-lml/x-gps
csmlchemical/x-csmlrtfapplication/rtf
csstext/cssrtgapplication/metastream
curapplication/octet-streamrtxtext/richtext
dcmx-lml/x-evmrvvideo/vnd.rn-realvideo
dcrapplication/x-directorrwcapplication/x-rogerwilco
dcximage/x-dcxs3maudio/x-mod
dhtmltext/htmls3zaudio/x-mod
dirapplication/x-directorscaapplication/x-supercard
dllapplication/octet-streamscdapplication/x-msschedule
dmgapplication/octet-streamsdfapplication/e-score
dmsapplication/octet-streamseaapplication/x-stuffit
docapplication/mswordsgmtext/x-sgml
dotapplication/x-dotsgmltext/x-sgml
dviapplication/x-dvishapplication/x-sh
dwfdrawing/x-dwfsharapplication/x-shar
dwgapplication/x-autocadshtmlmagnus-internal/parsed-html
dxfapplication/x-autocadshwapplication/presentations
dxrapplication/x-directorsi6image/si6
ebkapplication/x-expandedbooksi7image/vnd.stiwap.sis
embchemical/x-embl-dl-nucleotidesi9image/vnd.lgtwap.sis
emblchemical/x-embl-dl-nucleotidesisapplication/vnd.symbian.install
epsapplication/postscriptsitapplication/x-stuffit
eriimage/x-eriskdapplication/x-Koan
esaudio/echospeechskmapplication/x-Koan
eslaudio/echospeechskpapplication/x-Koan
etcapplication/x-earthtimesktapplication/x-Koan
etxtext/x-setextslcapplication/x-salsa
evmx-lml/x-evmsmdaudio/x-smd
evyapplication/x-envoysmiapplication/smil
exeapplication/octet-streamsmilapplication/smil
fh4image/x-freehandsmpapplication/studiom
fh5image/x-freehandsmzaudio/x-smd
fhcimage/x-freehandsndaudio/basic
fifimage/fifspctext/x-speech
fmapplication/x-makersplapplication/futuresplash
fpximage/x-fpxsprapplication/x-sprite
fvivideo/isivideospriteapplication/x-sprite
gauchemical/x-gaussian-inputsptapplication/x-spt
gcaapplication/x-gca-compressedsrcapplication/x-wais-source
gdbx-lml/x-gdbstkapplication/hyperstudio
gifimage/gifstmaudio/x-mod
gpsapplication/x-gpssv4cpioapplication/x-sv4cpio
gtarapplication/x-gtarsv4crcapplication/x-sv4crc
gzapplication/x-gzipsvfimage/vnd
hdfapplication/x-hdfsvgimage/svg-xml
hdmtext/x-hdmlsvhimage/svh
hdmltext/x-hdmlsvrx-world/x-svr
hlpapplication/winhlpswfapplication/x-shockwave-flash
hqxapplication/mac-binhex40swflapplication/x-shockwave-flash
htmtext/htmltapplication/x-troff
htmltext/htmltadapplication/octet-stream
htstext/htmltalktext/x-speech
icex-conference/x-cooltalktarapplication/x-tar
icoapplication/octet-streamtazapplication/x-tar
iefimage/ieftbpapplication/x-timbuktu
ifmimage/giftbtapplication/x-timbuktu
ifsimage/ifstclapplication/x-tcl
imyaudio/melodytexapplication/x-tex
insapplication/x-NET-Installtexiapplication/x-texinfo
ipsapplication/x-ipscripttexinfoapplication/x-texinfo
ipxapplication/x-ipixtgzapplication/x-tar
itaudio/x-modthmapplication/vnd.eri.thm
itzaudio/x-modtifimage/tiff
ivri-world/i-vrmltiffimage/tiff
j2kimage/j2ktkiapplication/x-tkined
jadtext/vnd.sun.j2me.app-descriptortkinedapplication/x-tkined
jamapplication/x-jamtocapplication/toc
jarapplication/java-archivetoyimage/toy
jnlpapplication/x-java-jnlp-filetrapplication/x-troff
jpeimage/jpegtrkx-lml/x-gps
jpegimage/jpegtrmapplication/x-msterminal
jpgimage/jpegtsiaudio/tsplayer
jpzimage/jpegtspapplication/dsptype
jsapplication/x-javascripttsvtext/tab-separated-values
jwcapplication/jwctsvtext/tab-separated-values
kjxapplication/x-kjxttfapplication/octet-stream
lakx-lml/x-lakttzapplication/t-time
latexapplication/x-latextxttext/plain
lccapplication/fastmanultaudio/x-mod
lclapplication/x-digitallocaustarapplication/x-ustar
lcrapplication/x-digitallocauuapplication/x-uuencode
lghapplication/lghuueapplication/x-uuencode
lhaapplication/octet-streamvcdapplication/x-cdlink
lmlx-lml/x-lmlvcftext/x-vcard
lmlpackx-lml/x-lmlpackvdovideo/vdo
lsfvideo/x-ms-asfvibaudio/vib
lsxvideo/x-ms-asfvivvideo/vivo
lzhapplication/x-lzhvivovideo/vivo
m13application/x-msmediaviewvmdapplication/vocaltec-media-desc
m14application/x-msmediaviewvmfapplication/vocaltec-media-file
m15audio/x-modvmiapplication/x-dreamcast-vms-info
m3uaudio/x-mpegurlvmsapplication/x-dreamcast-vms
m3urlaudio/x-mpegurlvoxaudio/voxware
ma1audio/ma1vqeaudio/x-twinvq-plugin
ma2audio/ma2vqfaudio/x-twinvq
ma3audio/ma3vqlaudio/x-twinvq
ma5audio/ma5vrex-world/x-vream
manapplication/x-troff-manvrmlx-world/x-vrml
mapmagnus-internal/imagemapvrtx-world/x-vrt
mbdapplication/mbedletvrwx-world/x-vream
mctapplication/x-mascotvtsworkbook/formulaone
mdbapplication/x-msaccesswavaudio/x-wav
mdzaudio/x-modwaxaudio/x-ms-wax
meapplication/x-troff-mewbmpimage/vnd.wap.wbmp
meltext/x-vmelwebapplication/vnd.xara
miapplication/x-mifwiimage/wavelet
midaudio/midiwisapplication/x-InstallShield
midiaudio/midiwmvideo/x-ms-wm
mifapplication/x-mifwmaaudio/x-ms-wma
milimage/x-calswmdapplication/x-ms-wmd
mioaudio/x-miowmfapplication/x-msmetafile
mmfapplication/x-skt-lbswmltext/vnd.wap.wml
mngvideo/x-mngwmlcapplication/vnd.wap.wmlc
mnyapplication/x-msmoneywmlstext/vnd.wap.wmlscript
mocapplication/x-mochawmlscapplication/vnd.wap.wmlscriptc
mochaapplication/x-mochawmlscripttext/vnd.wap.wmlscript
modaudio/x-modwmvaudio/x-ms-wmv
mofapplication/x-yumekarawmxvideo/x-ms-wmx
molchemical/x-mdl-molfilewmzapplication/x-ms-wmz
mopchemical/x-mopac-inputwpngimage/x-up-wpng
movvideo/quicktimewptx-lml/x-gps
movievideo/x-sgi-moviewriapplication/x-mswrite
mp2audio/x-mpegwrlx-world/x-vrml
mp3audio/x-mpegwrzx-world/x-vrml
mp4video/mp4wstext/vnd.wap.wmlscript
mpcapplication/vnd.mpohun.certificatewscapplication/vnd.wap.wmlscriptc
mpevideo/mpegwvvideo/wavelet
mpegvideo/mpegwvxvideo/x-ms-wvx
mpgvideo/mpegwxlapplication/x-wxl
mpg4video/mp4x-gzipapplication/x-gzip
mpgaaudio/mpegxarapplication/vnd.xara
mpnapplication/vnd.mophun.applicationxbmimage/x-xbitmap
mppapplication/vnd.ms-projectxdmapplication/x-xdma
mpsapplication/x-mapserverxdmaapplication/x-xdma
mrltext/x-mrmlxdwapplication/vnd.fujixerox.docuworks
mrmapplication/x-mrmxhtapplication/xhtml+xml
msapplication/x-troff-msxhtmapplication/xhtml+xml
mtsapplication/metastreamxhtmlapplication/xhtml+xml
mtxapplication/metastreamxlaapplication/vnd.ms-excel
mtzapplication/metastreamxlcapplication/vnd.ms-excel
mzvapplication/metastreamxllapplication/x-excel
narapplication/zipxlmapplication/vnd.ms-excel
nbmpimage/nbmpxlsapplication/vnd.ms-excel
ncapplication/x-netcdfxltapplication/vnd.ms-excel
ndbx-lml/x-ndbxlwapplication/vnd.ms-excel
ndwnapplication/ndwnxmaudio/x-mod
nifapplication/x-nifxmltext/xml
nmzapplication/x-screamxmzaudio/x-mod
nokia-op-logoimage/vnd.nok-oplogo-colorxpiapplication/x-xpinstall
npxapplication/x-netfpxxpmimage/x-xpixmap
nsndaudio/nsndxsittext/xml
nvaapplication/x-neva1xsltext/xml
odaapplication/odaxultext/xul
oomapplication/x-AtlasMate-Pluginxwdimage/x-xwindowdump
pacaudio/x-pacxyzchemical/x-pdb
paeaudio/x-epacyz1application/x-yz1
panapplication/x-panzapplication/x-compress
pbmimage/x-portable-bitmapzacapplication/x-zaurus-zac
pcximage/x-pcxzipapplication/zip

三、文件創建、編輯與刪除

1、創建文件,可以在onActivity中接收到結果

// Here are some examples of how you might call this method. // The first parameter is the MIME type, and the second parameter is the name // of the file you are creating: // // createFile("text/plain", "foobar.txt"); // createFile("image/png", "mypicture.png");// Unique request code. private static final int WRITE_REQUEST_CODE = 43; ... private void createFile(String mimeType, String fileName) {Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);// Filter to only show results that can be "opened", such as// a file (as opposed to a list of contacts or timezones).intent.addCategory(Intent.CATEGORY_OPENABLE);// Create a file with the requested MIME type.intent.setType(mimeType);intent.putExtra(Intent.EXTRA_TITLE, fileName);startActivityForResult(intent, WRITE_REQUEST_CODE); }

2、獲取Uri之后,要是文件的Document.COLUMN_FLAGS 包含SUPPORTS_DELETE,則可以刪除該文件:

DocumentsContract.deleteDocument(getContentResolver(), uri);

3、編輯文件

private static final int EDIT_REQUEST_CODE = 44; /*** Open a file for writing and append some text to it.*/private void editDocument() {// ACTION_OPEN_DOCUMENT is the intent to choose a file via the system's// file browser.Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);// Filter to only show results that can be "opened", such as a// file (as opposed to a list of contacts or timezones).intent.addCategory(Intent.CATEGORY_OPENABLE);// Filter to show only text files.intent.setType("text/plain");startActivityForResult(intent, EDIT_REQUEST_CODE); }private void alterDocument(Uri uri) {try {ParcelFileDescriptor pfd = getActivity().getContentResolver().openFileDescriptor(uri, "w");FileOutputStream fileOutputStream =new FileOutputStream(pfd.getFileDescriptor());fileOutputStream.write(("Overwritten by MyCloud at " +System.currentTimeMillis() + "\n").getBytes());// Let the document provider know you're done by closing the stream.fileOutputStream.close();pfd.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} }

4、檢查最新的文件數據

final int takeFlags = intent.getFlags()& (Intent.FLAG_GRANT_READ_URI_PERMISSION| Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data. getContentResolver().takePersistableUriPermission(uri, takeFlags);

四、拓展

1、Android 7.0在存儲訪問框架中添加了虛擬文件的概念。
2、即使虛擬文件沒有二進制表示形式,您的客戶端應用程序也可以通過將其強制轉換為其他文件類型或使用ACTION_VIEW意圖查看這些文件來打開其內容。
3、要打開虛擬文件,您的客戶端應用程序需要包含特殊的邏輯來處理它們。如果要獲取文件的字節表示形式(例如,預覽文件),則需要從文檔提供者處請求其他MIME類型。
4、要在您的應用程序中獲取虛擬文檔的URI,首先要創建一個Intent以打開文件選擇器UI,就像前面在Seach中為文檔顯示的代碼一樣。
5、重要提示:由于應用無法使用openInputStream()方法直接打開虛擬文件,因此,如果您在ACTION_OPEN_DOCUMENT意向中包括CATEGORY_OPENABLE類別,則您的應用將不會收到任何虛擬文件。用戶做出選擇后,系統將調用onActivityResult()方法,如先前在處理結果中所示。您的應用可以檢索文件的URI,然后使用類似于以下代碼片段的方法來確定文件是否為虛擬文件。驗證文件為虛擬文件后,可以將其強制轉換為其他MIME類型,例如圖像文件。以下代碼段顯示了如何檢查虛擬文件是否可以表示為映像,如果可以,則從虛擬文件獲取輸入流。

private boolean isVirtualFile(Uri uri) {if (!DocumentsContract.isDocumentUri(this, uri)) {return false;}Cursor cursor = getContentResolver().query(uri,new String[] { DocumentsContract.Document.COLUMN_FLAGS },null, null, null);int flags = 0;if (cursor.moveToFirst()) {flags = cursor.getInt(0);}cursor.close();return (flags & DocumentsContract.Document.FLAG_VIRTUAL_DOCUMENT) != 0; }private InputStream getInputStreamForVirtualFile(Uri uri, String mimeTypeFilter)throws IOException {ContentResolver resolver = getContentResolver();String[] openableMimeTypes = resolver.getStreamTypes(uri, mimeTypeFilter);if (openableMimeTypes == null ||openableMimeTypes.length < 1) {throw new FileNotFoundException();}return resolver.openTypedAssetFileDescriptor(uri, openableMimeTypes[0], null).createInputStream(); }

總結

以上是生活随笔為你收集整理的Android打开系统文件管理器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。