Android设备通过wifi传递数据在网上搜索有两种方式:
第一种是两台设备一台手机开热点给另外一个手机连接传递数据。
第二种是通过wifi direct来进行连接来传递数据。
第一种方式可以参考这个博客
http://blog.csdn.net/hudashi/article/details/25283087
本文主要讲第二种方式。
wifi direct 意思为wifi直连也就点对点的传输数据。通过 Android api里面 WifiP2pManager对象中的方法,以及监听广播可以达到通过wifi进行数据传递。
对于WifiP2pManager官方是这样介绍的:
This class provides the API for managing Wi-Fi peer-to-peer connectivity. This lets an application discover available peers, setup connection to peers and query for the list of peers. When a p2p connection is formed over wifi, the device continues to maintain the uplink connection over mobile or any other available network for internet connectivity on the device.
The API is asynchronous and responses to requests from an application are on listener callbacks provided by the application. The application needs to do an initialization with initialize(Context, Looper, WifiP2pManager.ChannelListener) before doing any p2p operation.
………
官方介绍的很仔细,大家也可以访问官方网站,英文不好的可以使用翻译工具翻译。
一、在我们的Activity中去初始化我们的IntentInfilter以及WifiP2pManager。当然首先需要在我们的清单文件中加上对应的权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
// add necessary intent values to be matched.
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)
intentFilter
.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)
intentFilter
.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)
manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE)
channel = manager.initialize(this, getMainLooper(), null)
二、通过BroadcastReceiver广播来监听我们的wifi变化从而来做出想对应的操作,自己定义一个类继承BroadcastReceiver重写onReceive方法。在onReceive()方法中:
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
activity.setIsWifiP2pEnabled(true);
} else {
activity.setIsWifiP2pEnabled(false);
activity.resetData();
Log.d(WiFiDirectActivity.TAG, "P2P state changed - " + state);
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
Log.d(WiFiDirectActivity.TAG, "P2P peers changed");
} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION
.equals(action)) {
if (manager == null) {
return;
NetworkInfo networkInfo = (NetworkInfo) intent
.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
if (networkInfo.isConnected()) {
DeviceDetailFragment fragment = (DeviceDetailFragment) activity
.getFragmentManager()
.findFragmentById(R.id.frag_detail);
manager.requestConnectionInfo(channel, fragment);
} else {
activity.resetData();
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
.equals(action)) {
DeviceListFragment fragment = (DeviceListFragment) activity
.getFragmentManager().findFragmentById(R.id.frag_list);
fragment.updateThisDevice((WifiP2pDevice) intent
.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));
三、在Activity中的生命周期方法中注册和反注册我们的广播
@Override
public void onResume() {
super.onResume();
receiver = new WiFiDirectBroadcastReceiver(manager, channel, this);
registerReceiver(receiver, intentFilter);
@Override
public void onPause() {
super.onPause();
unregisterReceiver(receiver);
五、通过WifiP2pManager查找设备,当查找到设备时就会调用WifiP2pManager.PeerListListener接口中的onPeersAvailable()方法。
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(WiFiDirectActivity.this,
"Discovery Initiated", Toast.LENGTH_SHORT).show();
@Override
public void onFailure(int reasonCode) {
Toast.makeText(WiFiDirectActivity.this,
"Discovery Failed : " + reasonCode,
Toast.LENGTH_SHORT).show();
六、在实现了WifiP2pManager.PeerListListener接口的类中找到onPeersAvailable()方法,我们可以在这个方法中做一些操作,将获取到的设备添加到一个ListView中。
@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
peers.clear();
peers.addAll(peerList.getDeviceList());
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
if (peers.size() == 0) {
Log.e(WiFiDirectActivity.TAG, "No devices found");
return;
public void clearPeers() {
peers.clear();
((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
七、此时在BroadcastReceiver中就会收到一条 WIFI_P2P_PEERS_CHANGED_ACTION 动作的意图的广播,在上面中添加如下代码:
// 表示找到了匹配的设备,在这里我们发起请求
if (manager != null) {
manager.requestPeers(channel, (PeerListListener) activity
.getFragmentManager().findFragmentById(R.id.frag_list))
八、接下来就是连接我们的设备了
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
mManager.connect(mChannel, config, new ActionListener() {
@Override
public void onSuccess() {
@Override
public void onFailure(int reason) {
Toast.makeText(WiFiDirectActivity.this, "Connect failed. Retry.",
Toast.LENGTH_SHORT).show();
上述就是我们Wifi Direct连接的整个流程了,有写的不好的或者有哪里不懂的可以留言往指正。
Android设备通过wifi传递数据在网上搜索有两种方式: 第一种是两台设备一台手机开热点给另外一个手机连接传递数据。 第二种是通过wifi direct来进行连接来传递数据。 第一种方式可以参考这个博客 http://blog.csdn.net/hudashi/article/details/25283087 本文主要讲第二种方式。 wi
在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)——WiFi的搜索和连接。本篇接着简单介绍手机上如何通过WiFi热点进行数据传输。跟蓝牙通讯一样,WiFi热点数据传输也是要运用到Socket。这里我创建了两个线程ConnectThread和ListenerThread,分别去处理数据传输和监听连接。ConnectThread**
测试需要两部安卓手机A,B。A手机创建WIFI热点作为服务器,B手机连接A手机WIFI热点,作为客户端。
//A手机服务器 接收数据步骤:1点击创建Wifi热点2点击"turn_on_receiver"接收数据
//B手机客户端 发送数据步骤:1点击连接Wifi2点击"turn_on_send"发送数据
点对点传输(P2P)又是WLAN直连,他可以在没有中间接入点的情况下,通过 WLAN 进行直接互联。他有用户介入操作少,比蓝牙传输速度高等特点,对设备的要求仅仅为14,同时他又不占用wlan0网卡。
WLAN P2P 需要使用到 WifiP2pManager ,同时需要以下权限,这里面有一些是运行时权限,需要用户同意后才能使用。
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.pe
Android手机通过wifi进行数据传输(一)
http://hubingforever.blog.163.com/blog/static/17104057920131021270959/
Android手机通过wifi进行数据传输(二)
http://hubingforever.blog.163.com/blog/static/17104057920131021243
Android页面之间数据传递可以通过以下几种方式实现:
1. Intent传递数据:可以在一个Activity中使用Intent对象将数据传递到另一个Activity中,使用putExtra()方法将数据添加到Intent对象中,然后使用startActivity()方法启动另一个Activity。在另一个Activity中,使用getIntent()方法获取传递过来的Intent对象,然后使用getXXXExtra()方法获取传递过来的数据。
2. Bundle传递数据:可以在一个Activity中使用Bundle对象将数据打包传递到另一个Activity中,使用putXXX()方法将数据添加到Bundle对象中,然后使用putExtras()方法将Bundle对象添加到Intent对象中,最后使用startActivity()方法启动另一个Activity。在另一个Activity中,使用getIntent()方法获取传递过来的Intent对象,然后使用getExtras()方法获取传递过来的Bundle对象,最后使用getXXX()方法获取传递过来的数据。
3. 接口回调传递数据:可以定义一个接口,在一个Activity中实现该接口,并将该实现对象传递给另一个Activity。在另一个Activity中,通过调用该接口的方法传递数据给第一个Activity。
4. 全局变量传递数据:可以定义一个全局变量,在一个Activity中设置该变量的值,然后在另一个Activity中获取该变量的值。
5. SharedPreferences传递数据:可以使用SharedPreferences在一个Activity中保存数据,然后在另一个Activity中读取该数据。
希望以上方式能够对您有所帮助。
解决:'chromedriver' executable needs to be in PATH问题
my bucket list:
解决:'chromedriver' executable needs to be in PATH问题
Christian_sno: