文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android WiFi P2P数据传输

2023-09-12 16:52

关注

WiFi P2P是指通过WiFi直接连接两台设备之间的无线点对点通信,不需要通过路由器或者互联网。这种技术被广泛应用于移动设备之间的文件共享、游戏联机、音乐播放等应用场景中。

WiFi P2P的优点在于可以在没有网络的情况下建立设备之间的连接,同时具有高速和低延迟的特点。它还支持多种语言编程接口,并且使用起来非常简单。

在Android中,WiFi P2P可以通过WifiP2pManager类进行实现,它提供了许多方法来扫描可用设备、建立P2P连接并传输数据等功能。开发者可以通过这些方法来实现设备之间的文件传输等操作。

WiFi和蓝牙是两种不同类型的无线通信技术,在许多方面都有不同的特点和用途。
以下是一些常见的WiFi和蓝牙的比较:

  1. 传输速率:WiFi传输速度更快,可以达到几百兆比特每秒,而蓝牙通常只能达到几兆比特每秒。
  2. 距离限制:WiFi的覆盖范围通常更大,可以在较长的距离内进行通信,而蓝牙的覆盖范围通常比较小,仅能在短距离内通信。
  3. 电池寿命:由于WiFi的功率更大,因此它通常消耗更多的电池生命,而蓝牙通常需要更少的功率,因此它通常耗电更少。

下面是使用Wifi P2P传输文件的基本代码示例,您可以根据需要进行调整:

1. 添加权限和依赖项

在AndroidManifest.xml中添加以下权限:

在build.gradle文件中添加以下依赖项:

implementation 'com.android.support:appcompat-v7:28.0.0'implementation 'com.android.support:design:28.0.0'implementation 'com.android.support:recyclerview-v7:28.0.0'implementation 'com.android.support:cardview-v7:28.0.0'

2. 设置布局文件

在布局文件中添加以下代码:

        

3. 创建WifiP2pManager和WifiP2pManager.Channel对象

在Activity中定义以下变量:

private WifiP2pManager mManager;private WifiP2pManager.Channel mChannel;private BroadcastReceiver mReceiver;private IntentFilter mIntentFilter;private List peers = new ArrayList<>();private WifiP2pDeviceListAdapter mAdapter;

在Activity的onCreate()方法中,创建WifiP2pManager和WifiP2pManager.Channel对象:

mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);mChannel = mManager.initialize(this, getMainLooper(), null);

4. 注册广播接收器

在Activity中创建以下BroadcastReceiver对象:

mReceiver = new WifiDirectBroadcastReceiver(mManager, mChannel, this);

WifiDirectBroadcastReceiver是一个自定义广播接收器类,它负责处理与Wifi P2P相关的广播事件。

在Activity的onResume()方法中,注册广播接收器:

registerReceiver(mReceiver, mIntentFilter);

在Activity的onPause()方法中,注销广播接收器:

unregisterReceiver(mReceiver);

5. 开始搜索可用设备

通过调用startDiscovery()方法开始搜索可用设备:

mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {    @Override    public void onSuccess() {        //搜索成功    }    @Override    public void onFailure(int reasonCode) {        //搜索失败    }});

6. 显示可用设备列表

创建一个自定义适配器类WifiP2pDeviceListAdapter,用于显示可用设备列表中的每个设备:

public class WifiP2pDeviceListAdapter extends ArrayAdapter {    private List items;    private Context ctx;    public WifiP2pDeviceListAdapter(Context context, int textViewResourceId,         List objects) {        super(context, textViewResourceId, objects);        items = objects;        ctx = context;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        View v = convertView;        if (v == null) {            LayoutInflater vi = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);            v = vi.inflate(R.layout.row_devices, null);        }        WifiP2pDevice device = items.get(position);        if (device != null) {            TextView top = (TextView) v.findViewById(R.id.device_name);            TextView bottom = (TextView) v.findViewById(R.id.device_details);            if (top != null) {                top.setText(device.deviceName);            }            if (bottom != null) {                bottom.setText(getDeviceStatus(device.status));            }        }        return v;    }    private String getDeviceStatus(int deviceStatus) {        switch (deviceStatus) {            case WifiP2pDevice.AVAILABLE:                return "可用";            case WifiP2pDevice.INVITED:                return "已邀请";            case WifiP2pDevice.CONNECTED:                return "已连接";            case WifiP2pDevice.FAILED:                return "失败";            case WifiP2pDevice.UNAVAILABLE:                return "不可用";            default:                return "未知状态";        }    }}

在Activity中,设置ListView的适配器:

mAdapter = new WifiP2pDeviceListAdapter(this, R.layout.row_devices, peers);ListView listView = (ListView) findViewById(R.id.list_devices);listView.setAdapter(mAdapter);

在BroadcaseReceiver接收到搜索结果后,在Activity中更新设备列表:

@Overridepublic void onPeersAvailable(WifiP2pDeviceList peerList) {    peers.clear();    peers.addAll(peerList.getDeviceList());    mAdapter.notifyDataSetChanged();    if (peers.size() == 0) {        //没有可用设备    }}

7. 连接到另一个设备

在设备列表中选择一个设备,并调用connect()方法:

mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {    @Override    public void onSuccess() {        //连接成功    }    @Override    public void onFailure(int reason) {        //连接失败    }});

8. 传输文件

在连接成功后,使用WifiP2pGroup.getClientList()方法获取已连接设备的列表,将文件传输到列表中的第一个设备:

WifiP2pGroup group = (WifiP2pGroup) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);if (group != null) {    Collection clients = group.getClientList();    if (clients.size() > 0) {        WifiP2pClient client = (WifiP2pClient) clients.toArray()[0];        File file = new File(filePath);        if (file.exists()) {            try {                FileInputStream inputStream = new FileInputStream(file);                OutputStream outputStream = client.getOutputStream();                byte[] buffer = new byte[1024];                int length;                while ((length = inputStream.read(buffer)) > 0) {                    outputStream.write(buffer, 0, length);                }                outputStream.close();                inputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        } else {            //文件不存在        }    } else {        //没有连接设备    }} else {    //组不存在}

注意:以上代码仅用于演示如何使用Wifi P2P传输文件,您需要根据自己的情况进行修改。此外,Wifi P2P传输文件的性能可能会受到网络环境的影响,并不适用于大文件传输。

来源地址:https://blog.csdn.net/weixin_44008788/article/details/131294945

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯