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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android官方开发文档Training系列课程中文版:通过NFC共享文件之从其它设备接收文件

發(fā)布時間:2024/7/5 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android官方开发文档Training系列课程中文版:通过NFC共享文件之从其它设备接收文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址:http://android.xsoftlab.net/training/beam-files/receive-files.html

Android Beam文件傳輸系統(tǒng)會將文件拷貝到接收設(shè)備的指定目錄中。它還會使用Android媒體掃描器掃描被拷貝的文件,并會將媒體文件的入口信息添加到MediaStore提供者中去。

響應(yīng)展示數(shù)據(jù)的請求

當(dāng)Android Beam文件傳輸系統(tǒng)結(jié)束了文件拷貝,它會發(fā)送通知,這個通知會包含一個Intent對象,這個Intent對象的行為為ACTION_VIEW,以及被傳送的第一個文件的MIME類型,以及指向第一個文件的URI地址。當(dāng)用戶點擊了通知,這個Intent會被廣播到系統(tǒng)中。為了使APP可以響應(yīng)這個意圖,需要在清單文件中的響應(yīng)Activity的< activity>元素下添加元素,并在其中添加如下子元素:

<action android:name="android.intent.action.VIEW" />
  • 匹配由通知發(fā)送來的ACTION_VIEW意圖。
<category android:name="android.intent.category.CATEGORY_DEFAULT" />
  • 匹配沒有明確類別的意圖。
<data android:mimeType="mime-type" />
  • 匹配一種MIME類型。這里的mime-type類型應(yīng)為APP可以處理的類型。

舉個例子,下面這段代碼展示了如何在被觸發(fā)的Activity com.example.android.nfctransfer.ViewActivity的清單文件中添加意圖過濾器:

<activity android:name="com.example.android.nfctransfer.ViewActivity"android:label="Android Beam Viewer" >...<intent-filter><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/>...</intent-filter></activity>

**Note:**Android Beam文件傳輸系統(tǒng)并不是ACTION_VIEW意圖的唯一來源,接收設(shè)備上的其它APP也可以發(fā)送含有這個行為的意圖。Get the directory from a content URI這節(jié)會討論如何處理這種情況。

請求文件權(quán)限

為了可以讀取Android Beam文件傳輸系統(tǒng)拷貝到設(shè)備的文件,需要請求READ_EXTERNAL_STORAGE權(quán)限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

如果你想要將被拷貝的文件拷貝到自己的存儲器上,這里應(yīng)該使用權(quán)限WRITE_EXTERNAL_STORAGE。WRITE_EXTERNAL_STORAGE權(quán)限包含了READ_EXTERNAL_STORAGE權(quán)限。

Note:在Android 4.2.2上,READ_EXTERNAL_STORAGE權(quán)限會在用戶需要的時候強(qiáng)制執(zhí)行。未來的版本可能在各種情況下都需要該權(quán)限,所以為了確保向后兼容,請在它要求以前就給它添加上。

因為你的APP對其內(nèi)部存儲器有操作的權(quán)利,所以在拷貝文件到內(nèi)部存儲器上時不需要請求寫入權(quán)限。

獲取被拷貝文件的目錄

Android Beam文件傳輸系統(tǒng)會通過一個單一的傳輸通道將所有的文件拷貝到接收設(shè)備上一個目錄中。Android Beam文件傳輸系統(tǒng)的通知會將內(nèi)容Intent中的URI指向到第一個已被傳送的文件上。然而,APP可能還需要對傳輸系統(tǒng)上的其它ACTION_VIEW意圖來源進(jìn)行接收。為了判斷應(yīng)該如何處理發(fā)送過來的Intent,你需要檢查它的計劃(scheme)與權(quán)力(authority)。

為了可以從URI上獲取計劃,需要調(diào)用Uri.getScheme()方法。下面這段代碼展示了如何檢查計劃以及如何處理URI的訪問:

public class MainActivity extends Activity {...// A File object containing the path to the transferred filesprivate File mParentPath;// Incoming Intentprivate Intent mIntent;.../** Called from onNewIntent() for a SINGLE_TOP Activity* or onCreate() for a new Activity. For onNewIntent(),* remember to call setIntent() to store the most* current Intent**/private void handleViewIntent() {...// Get the Intent actionmIntent = getIntent();String action = mIntent.getAction();/** For ACTION_VIEW, the Activity is being asked to display data.* Get the URI.*/if (TextUtils.equals(action, Intent.ACTION_VIEW)) {// Get the URI from the IntentUri beamUri = mIntent.getData();/** Test for the type of URI, by getting its scheme value*/if (TextUtils.equals(beamUri.getScheme(), "file")) {mParentPath = handleFileUri(beamUri);} else if (TextUtils.equals(beamUri.getScheme(), "content")) {mParentPath = handleContentUri(beamUri);}}...}... }

從文件URI獲取目錄

如果接收到的Intent包含一個文件URI,那么URI會包含文件的絕對文件名,包括全目錄路徑以及文件的名字。對Android Beam文件傳輸系統(tǒng)來說,如果有的話,這個目錄路徑指向了其它被傳送文件的位置。為了獲取目錄路徑,獲取URI的路徑部分,路徑部分包含了除了前綴file:之外的所有URI。從路徑部分創(chuàng)建一個File對象,然后該文件對象的上級目錄:

...public String handleFileUri(Uri beamUri) {// Get the path part of the URIString fileName = beamUri.getPath();// Create a File object for this filenameFile copiedFile = new File(fileName);// Get a string containing the file's parent directoryreturn copiedFile.getParent();}...

從內(nèi)容URI獲取目錄

如果接收到的Intent包含一個內(nèi)容URI,那這個URI可能會指向在MediaStore內(nèi)容提供者中存儲的文件的路徑和名稱。你可以通過測試URI的權(quán)限值來判斷是否是MediaStore的內(nèi)容URI。MediaStore的內(nèi)容URI可能來自Android Beam文件傳輸系統(tǒng)或者其它APP,但是無論什么情況你都可以從內(nèi)容URI中接收一個目錄以及文件的名稱。

你也可以接收包含了不同于MediaStore的內(nèi)容URI的ACTION_VIEW意圖。在這種情況下,這內(nèi)容URI不包含 ACTION_VIEW的權(quán)限值,以及內(nèi)容URI通常不會執(zhí)行一個目錄。

Note: 對于Android Beam文件傳輸系統(tǒng)來說,你可以接收含有內(nèi)容URI的ACTION_VIEW意圖,如果第一個接到的文件含有”audio/*”, “image/*”, 或者”video/*”之類的MIME類型。這意味著它是和媒體有關(guān)的。Android Beam文件傳輸系統(tǒng)會索引媒體文件,它會通過運(yùn)行媒體掃描器掃描存儲有被傳送文件的目錄來傳送文件。媒體掃描器會將掃描結(jié)果寫入到MediaStore內(nèi)容提供者中,然后它會傳第一個文件的內(nèi)容URI給Android Beam文件傳輸系統(tǒng)。這個內(nèi)容URI是在通知意圖中的接收到的那個。給了獲取第一個文件的目錄,需要使用內(nèi)容URI從MediaStore中接收它。

判斷內(nèi)容提供者

為了判斷是否可以從內(nèi)容URI中接收文件的目錄,通過調(diào)用Uri.getAuthority()來獲取URI的權(quán)限來判斷與內(nèi)容提供者相關(guān)聯(lián)的URI。它的值可能有兩種情況:

MediaStore.AUTHORITY

這個URI是可以被MediaStore追蹤到的單個文件或者多個文件。MediaStore中可以接收全路徑名稱,以及可以從文件名中獲取它的目錄。

其它任意的權(quán)限值

從其它內(nèi)容提供者而來的內(nèi)容URI。展示了與內(nèi)容URI相關(guān)的數(shù)據(jù),但是不能夠獲取文件的目錄。

為了可以從MediaStore內(nèi)容URI中獲取文件目錄,需要進(jìn)行查詢,查詢需要指定Uri參數(shù)為接收到的內(nèi)容URI,projection參數(shù)為列MediaColumns.DATA,它返回的Cursor對象包含了URI所代表的文件的全路徑名稱。這個路徑還包含Android Beam文件傳輸系統(tǒng)剛剛拷貝到設(shè)備上的其它所有文件。

下面這段代碼展示了如何測試內(nèi)容URI的權(quán)限以及從被傳送的文件中接收路徑以及文件名:

...public String handleContentUri(Uri beamUri) {// Position of the filename in the query Cursorint filenameIndex;// File object for the filenameFile copiedFile;// The filename stored in MediaStoreString fileName;// Test the authority of the URIif (!TextUtils.equals(beamUri.getAuthority(), MediaStore.AUTHORITY)) {/** Handle content URIs for other content providers*/// For a MediaStore content URI} else {// Get the column that contains the file nameString[] projection = { MediaStore.MediaColumns.DATA };Cursor pathCursor =getContentResolver().query(beamUri, projection,null, null, null);// Check for a valid cursorif (pathCursor != null &&pathCursor.moveToFirst()) {// Get the column index in the CursorfilenameIndex = pathCursor.getColumnIndex(MediaStore.MediaColumns.DATA);// Get the full file name including pathfileName = pathCursor.getString(filenameIndex);// Create a File object for the filenamecopiedFile = new File(fileName);// Return the parent directory of the filereturn new File(copiedFile.getParent());} else {// The query didn't work; return nullreturn null;}}}...

如果要學(xué)習(xí)更多從內(nèi)容提供者中接收數(shù)據(jù)的其它知識,請參見章節(jié):Retrieving Data from the Provider.

總結(jié)

以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:通过NFC共享文件之从其它设备接收文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。