【Android Developers Training】 41. 向另一台

系统 1702 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条评论