亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android Developers Training】 41. 向另一臺

系統 1891 0

注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。

原文鏈接: http://developer.android.com/training/beam-files/send-files.html


這節課將向你展示如何通過Android Beam文件傳輸向另一臺設備發送大文件。要發送文件,首先需要申明使用NFC和外部存儲的權限,你需要測試一下你的設備是否支持NFC,從而能夠向Android Beam文件傳輸提供文件的URI。

使用 Android Beam文件傳輸功能有下列要求:

  1. Android Beam文件傳輸功能只能在Android 4.1(API Level 16)及以上使用。
  2. 你希望傳送的文件必須放置于外部存儲。學習更多關于外部存儲的知識,可以閱讀: Using the External Storage
  3. 每個你希望傳送的文件必須是全局可讀的。你可以通過 File.setReadable(true,false) 來為文件設置相應的讀權限。
  4. 你必須提供你要傳輸文件的URI。 Android Beam文件傳輸無法處理由 FileProvider.getUriForFile 生成的URI。

一). 在清單文件中申明功能

首先,編輯你的清單文件來申明你應用申明的權限和功能。

需求權限

為了允許你的應用使用 Android Beam文件傳輸使用NFC從外部存儲發送文件,你必須在你的應用清單申明下面的權限:

NFC

允許你的應用通過NFC發送數據。為了指定該權限,添加下面的標簽作為一個 <manifest> 標簽的子標簽:

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

READ_EXTERNAL_STORAGE

允許你的應用讀取外部存儲。為了指定這個權限, 添加下面的標簽作為一個 <manifest> 標簽的子標簽:

      
        <
      
      
        uses-permission

            
      
      
        android:name
      
      
        ="android.permission.READ_EXTERNAL_STORAGE"
      
      
        />
      
    

Note:

對于Android 4.2.2(API Level 17),這個權限不是必需的。在后續的系統版本中,若應用需要讀取外部存儲,可能會需要申明該權限。為了保證將來程序穩定性,建議在該權限申明變成必需的之前,就在清單文件中申明好。

指定NFC功能

指定你的應用使用使用NFC, 添加 <uses-feature> 標簽作為一個 <manifest> 標簽的子標簽。設置“ android:required ”屬性字段為“ true ”,這樣可以使得你的應用只有在NFC可以使用時,才能運行。

下面的代碼展示了如何指定 <uses-feature> 標簽:

      
        <
      
      
        uses-feature

    
      
      
        android:name
      
      
        ="android.hardware.nfc"
      
      
        

    android:required
      
      
        ="true"
      
      
        />
      
    

注意,如果你的應用將NFC作為可選的一個功能,但期望在NFC不可使用時程序還能繼續執行,你就應該設置 android:required ”屬性字段為“ false ”,然后再代碼中測試NFC。

指定Android Beam文件傳輸

由于Android Beam文件傳輸只能在 Android 4.1(API Level 16)及以上的平臺使用,如果你的應用將 Android Beam文件傳輸作為一個不可缺少的核心模塊,那么你必須指定 <uses-sdk> 標簽為: android:minSdkVersion ="16"。或者,你可以將 android:minSdkVersion 設置為其它值,然后再代碼中測試平臺版本,這在下一節中將展開。


二). 測試Android Beam文件傳輸是否支持

為了在你的應用清單文件中,定義NFC是可選的,你應該使用下面的標簽:

      
        <
      
      
        uses-feature 
      
      
        android:name
      
      
        ="android.hardware.nfc"
      
      
         android:required
      
      
        ="false"
      
      
        />
      
    

如果你設置了 android:required ="false",你必須再代碼中測試NFC和 Android Beam文件傳輸是否支持。

為了再代碼中測試 Android Beam文件傳輸,我們先通過 PackageManager.hasSystemFeature() 和參數 FEATURE_NFC ,來測試設備是否支持NFC。下一步,通過 SDK_INT 的值測試系統版本是否支持 Android Beam文件傳輸。如果 Android Beam文件傳輸是支持的,那么獲得一個NFC控制器的實例,它能允許你與NFC硬件進行通信,例如:

      
        public
      
      
        class
      
       MainActivity 
      
        extends
      
      
         Activity {

    ...

    NfcAdapter mNfcAdapter;

    
      
      
        //
      
      
         Flag to indicate that Android Beam is available
      
      
        boolean
      
       mAndroidBeamAvailable  = 
      
        false
      
      
        ;

    ...

    @Override

    
      
      
        protected
      
      
        void
      
      
         onCreate(Bundle savedInstanceState) {

        ...

        
      
      
        //
      
      
         NFC isn't available on the device
      
      
        if
      
       (!
      
        PackageManager.hasSystemFeature(PackageManager.FEATURE_NFC)) {

            
      
      
        /*
      
      
        

             * Disable NFC features here.

             * For example, disable menu items or buttons that activate

             * NFC-related features

             
      
      
        */
      
      
        

            ...

        
      
      
        //
      
      
         Android Beam file transfer isn't supported
      
      

        } 
      
        else
      
      
        if
      
       (Build.VERSION.SDK_INT <
      
        

                Build.VERSION_CODES.JELLY_BEAN_MR1) {

            
      
      
        //
      
      
         If Android Beam isn't available, don't continue.
      
      

            mAndroidBeamAvailable = 
      
        false
      
      
        ;

            
      
      
        /*
      
      
        

             * Disable Android Beam file transfer features here.

             
      
      
        */
      
      
        

            ...

        
      
      
        //
      
      
         Android Beam file transfer is available, continue
      
      

        } 
      
        else
      
      
         {

        mNfcAdapter 
      
      = NfcAdapter.getDefaultAdapter(
      
        this
      
      
        );

        ...

        }

    }

    ...

}
      
    

二). 創建一個提供文件的回調函數

一旦你確認了設備支持Android Beam文件傳輸,添加一個回調函數,當 Android Beam文件傳輸監測到用戶希望與另一個支持NFC的設備發送文件時,系統會調用。在該回調函數中,返回一個 Uri 對象數組, Android Beam文件傳輸將URI對應的文件拷貝發送給要接收的設備。

要添加這個回調函數,實現 NfcAdapter.CreateBeamUrisCallback 接口,和它的方法: createBeamUris() ,下面是一個例子:

      
        public
      
      
        class
      
       MainActivity 
      
        extends
      
      
         Activity {

    ...

    
      
      
        //
      
      
         List of URIs to provide to Android Beam
      
      
        private
      
       Uri[] mFileUris = 
      
        new
      
       Uri[10
      
        ];

    ...

    
      
      
        /**
      
      
        

     * Callback that Android Beam file transfer calls to get

     * files to share

     
      
      
        */
      
      
        private
      
      
        class
      
       FileUriCallback 
      
        implements
      
      
        

            NfcAdapter.CreateBeamUrisCallback {

        
      
      
        public
      
      
         FileUriCallback() {

        }

        
      
      
        /**
      
      
        

         * Create content URIs as needed to share with another device

         
      
      
        */
      
      
        

        @Override

        
      
      
        public
      
      
         Uri[] createBeamUris(NfcEvent event) {

            
      
      
        return
      
      
         mFileUris;

        }

    }

    ...

}
      
    

一旦你實現了這個接口,通過調用 setBeamPushUrisCallback() 將回調函數提供給 Android Beam文件傳輸。下面是一個例子:

      
        public
      
      
        class
      
       MainActivity 
      
        extends
      
      
         Activity {

    ...

    
      
      
        //
      
      
         Instance that returns available files from this app
      
      
        private
      
      
         FileUriCallback mFileUriCallback;

    ...

    @Override

    
      
      
        protected
      
      
        void
      
      
         onCreate(Bundle savedInstanceState) {

        ...

        
      
      
        //
      
      
         Android Beam file transfer is available, continue
      
      
                ...

        mNfcAdapter 
      
      = NfcAdapter.getDefaultAdapter(
      
        this
      
      
        );

        
      
      
        /*
      
      
        

         * Instantiate a new FileUriCallback to handle requests for

         * URIs

         
      
      
        */
      
      
        

        mFileUriCallback 
      
      = 
      
        new
      
      
         FileUriCallback();

        
      
      
        //
      
      
         Set the dynamic callback for URI requests.
      
      

        mNfcAdapter.setBeamPushUrisCallback(mFileUriCallback,
      
        this
      
      
        );

        ...

    }

    ...

}
      
    

Note:

你也可以將 Uri 對象數組通過你應用的 NfcAdapter 實例,直接提供給NFC框架。如果你能在NFC觸碰事件發生之前,定義這些URI,那么你可以選擇這個方法。要學習關于這個方法的知識,可以閱讀: NfcAdapter.setBeamPushUris()


三). 定義要發送的文件

為了將一個或更多個文件發送給支持NFC的設備,為每一個文件獲取一個文件URI(一個具有文件架構(scheme)的URI),然后將它們添加至一個 Uri 對象數組。要傳輸一個文件,你必須也有讀文件的權限。例如,下面的例子展示的是你如何根據文件名獲取它的文件URI,然后將URI添加至數組當中:

      
        /*
      
      
        

         * Create a list of URIs, get a File,

         * and set its permissions

         
      
      
        */
      
      
        private
      
       Uri[] mFileUris = 
      
        new
      
       Uri[10
      
        ];

        String transferFile 
      
      = "transferimage.jpg"
      
        ;

        File extDir 
      
      = getExternalFilesDir(
      
        null
      
      
        );

        File requestFile 
      
      = 
      
        new
      
      
         File(extDir, transferFile);

        requestFile.setReadable(
      
      
        true
      
      , 
      
        false
      
      
        );

        
      
      
        //
      
      
         Get a URI for the File and add it to the list of URIs
      
      

        fileUri =
      
         Uri.fromFile(requestFile);

        
      
      
        if
      
       (fileUri != 
      
        null
      
      
        ) {

            mFileUris[
      
      0] =
      
         fileUri;

        } 
      
      
        else
      
      
         {

            Log.e(
      
      "My Activity", "No File URI available for file."
      
        );

        }
      
    

【Android Developers Training】 41. 向另一臺設備發送文件


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人性毛片 | 香蕉国产人午夜视频在线观看 | 亚洲久久久久久久 | 狠狠色噜噜狠狠狠狠98 | 亚洲国产一区二区在线 | 国产视频一区二 | 日日插日日操 | 日本精品视频在线观看 | 国产成人精品久久一区二区小说 | 老司机午夜免费视频 | 一级特黄牲大片免费视频 | 性欧美一级毛片在线播放 | 欧美日韩中出 | 夜鲁夜鲁夜鲁在线观看福利 | 视频国产91 | 亚洲精品一区二区三区不卡 | 不卡视频在线播放 | 欧美成人免费香蕉 | 91国内在线观看 | 97影院午夜在线观看视频 | 久久天天躁日日躁狠狠躁 | 欧美高清一区 | 99热久久这里只精品国产9 | 中文字幕精品在线观看 | 一区二区三区四区亚洲 | 91色桃| 久久国产精品免费网站 | 国产成人午夜性a一级毛片 国产成人午夜性视频影院 国产成人系列 | 亚洲国产成人久久一区久久 | 在线观看麻豆国产精品 | 亚洲日韩色综合视频 | 欧美成人xxxx | 久久久久久久国产视频 | 国产高清一区二区三区免费视频 | 久久国产美女免费观看精品 | 国内精品久久久久久久影视麻豆 | 国内成人精品视频 | 我想看一级黄色毛片 | 久久精品男人的天堂 | 亚洲视频免费在线观看 | 日韩欧美一级毛片精品6 |