Android官方开发文档Training系列课程中文版:分享文件之请求一个共享文件
原文地址:http://android.xsoftlab.net/training/secure-file-sharing/request-file.html
當(dāng)APP需要訪問一個(gè)被其它APP所共享的文件時(shí),這個(gè)APP通常需要發(fā)送一個(gè)請(qǐng)求給共享文件的那個(gè)APP(服務(wù)端),在大多數(shù)的情況下,這個(gè)請(qǐng)求會(huì)啟動(dòng)一個(gè)服務(wù)端的Activity,這個(gè)Activity會(huì)展示可以共享的文件。用戶可以選擇一個(gè)文件,稍后服務(wù)端APP會(huì)將這個(gè)文件以URI的形式返回給客戶端APP。
這節(jié)課展示了客戶端APP如何向服務(wù)端APP請(qǐng)求一個(gè)共享文件,以及從服務(wù)端APP接收這個(gè)URI,和通過這個(gè)URI打開被選中的文件。
發(fā)送文件請(qǐng)求
如果要請(qǐng)求服務(wù)端的文件,客戶端APP需要調(diào)用startActivityForResult方法并傳入一個(gè)Intent對(duì)象,這個(gè)Intent對(duì)象包含了一個(gè)行為比如ACTION_PICK以及一個(gè)MIME類型,這個(gè)類型是指客戶端APP可以處理的類型。
舉個(gè)例子,下面這段代碼演示了如何發(fā)送一個(gè)Intent給服務(wù)端APP并啟動(dòng)展示共享文件的那個(gè)Activity:
public class MainActivity extends Activity {private Intent mRequestFileIntent;private ParcelFileDescriptor mInputPFD;...@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mRequestFileIntent = new Intent(Intent.ACTION_PICK);mRequestFileIntent.setType("image/jpg");...}...protected void requestFile() {/*** When the user requests a file, send an Intent to the* server app.* files.*/startActivityForResult(mRequestFileIntent, 0);...}... }訪問請(qǐng)求到的文件
服務(wù)端給客戶端返回了一個(gè)帶有文件URI的Intent。這個(gè)Intent會(huì)從客戶端中的onActivityResult()方法返回。一旦客戶端有了這個(gè)文件的URI,那么它就可以通過FileDescriptor來訪問這個(gè)文件。
在這個(gè)過程中,文件的安全性一直被保留,因?yàn)榭蛻舳私邮盏降腢RI只是數(shù)據(jù)的一部分。既然這個(gè)URI沒有包含目錄路徑,那么客戶端APP不可能發(fā)現(xiàn)并打開任何服務(wù)端上的任何其它文件。只有客戶端APP可以訪問文件,且僅僅是由服務(wù)器APP授予的權(quán)限。這個(gè)權(quán)限是個(gè)臨時(shí)的權(quán)限,所以一旦客戶端APP的任務(wù)終止,那么這個(gè)文件就不可被服務(wù)端APP之外的地方所訪問。
下面這段代碼演示了客戶端APP如何處理從服務(wù)端返回的Intent,以及如何使用URI來獲得FileDescriptor對(duì)象:
/** When the Activity of the app that hosts files sets a result and calls* finish(), this method is invoked. The returned Intent contains the* content URI of a selected file. The result code indicates if the* selection worked or not.*/@Overridepublic void onActivityResult(int requestCode, int resultCode,Intent returnIntent) {// If the selection didn't workif (resultCode != RESULT_OK) {// Exit without doing anything elsereturn;} else {// Get the file's content URI from the incoming IntentUri returnUri = returnIntent.getData();/** Try to open the file for "read" access using the* returned URI. If the file isn't found, write to the* error log and return.*/try {/** Get the content resolver instance for this context, and use it* to get a ParcelFileDescriptor for the file.*/mInputPFD = getContentResolver().openFileDescriptor(returnUri, "r");} catch (FileNotFoundException e) {e.printStackTrace();Log.e("MainActivity", "File not found.");return;}// Get a regular file descriptor for the fileFileDescriptor fd = mInputPFD.getFileDescriptor();...}}方法openFileDescriptor()返回了一個(gè)文件的ParcelFileDescriptor對(duì)象。客戶端APP可以根據(jù)這個(gè)對(duì)象得到FileDescriptor對(duì)象,這個(gè)對(duì)象便可以用來讀取文件了。
總結(jié)
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:分享文件之请求一个共享文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android官方开发文档Trainin
- 下一篇: Nginx 简介和使用