WiFi设备MAC地址的获取-----安卓端

本文介绍了一款基于WiFi的定位系统的开发过程,重点讲解了如何通过安卓应用收集WiFi信号信息,并实现与服务器的数据交互。文章详细展示了WiFiActivity类与WiFiAdmin类的设计,以及数据传输的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几天前隔壁机械学院找我一起做个项目,说是什么基于WiFi的定位系统,我查了下资料,想了想前期准备工作,就做了个这么各小玩意,顺便学习一下数据库和服务器的链接,以及安卓的网络编程。


先是安卓端的周围WiFi信息的获取


WiFiActivity:

package com.example.wifiget;

import java.util.List;  

import com.gm.servlet.SendDateToServer;

import android.app.Activity;  
import android.net.wifi.ScanResult;  
import android.os.Bundle;  
import android.os.Handler;
import android.os.Message;
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.TextView;  
import android.widget.Toast;  
  
public class WiFiActivity extends Activity {  
    /** Called when the activity is first created. */  
      private TextView allNetWork;    
        private Button scan;    
        private Button start;    
        private Button stop;    
        private Button check;    
        private WiFiAdmin mWifiAdmin;    
        // 扫描结果列表    
        private List<ScanResult> list;    
        private ScanResult mScanResult;    
        private StringBuffer sb=new StringBuffer();
        Handler handler=new Handler(){
    		public void handleMessage(Message msg) {
    			switch (msg.what) {
    			case SendDateToServer.SEND_SUCCESS:
    				Toast.makeText(WiFiActivity.this, "发送成功!", Toast.LENGTH_SHORT).show();
    				break;
    			case SendDateToServer.SEND_FAIL:
    				Toast.makeText(WiFiActivity.this, "发送失败!", Toast.LENGTH_SHORT).show();
    				break;

    			default:
    				break;
    			}
    		};	
    	};
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        mWifiAdmin = new WiFiAdmin(WiFiActivity.this);    
        init();    
    }  
    public void init(){  
        allNetWork = (TextView) findViewById(R.id.allNetWork);    
        scan = (Button) findViewById(R.id.scan);    
        start = (Button) findViewById(R.id.start);    
        stop = (Button) findViewById(R.id.stop);    
        check = (Button) findViewById(R.id.check);   
        scan.setOnClickListener(new MyListener());    
        start.setOnClickListener(new MyListener());    
        stop.setOnClickListener(new MyListener());    
        check.setOnClickListener(new MyListener());    
    }  
    private class MyListener implements OnClickListener{  
  
        @Override  
        public void onClick(View v) {  
            // TODO Auto-generated method stub  
            switch (v.getId()) {  
            case R.id.scan://扫描网络  
                  getAllNetWorkList();    
                break;  
           case R.id.start://打开Wifi  
                mWifiAdmin.openWifi();  
                Toast.makeText(WiFiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();  
                break;  
           case R.id.stop://关闭Wifi  
                mWifiAdmin.closeWifi();  
                Toast.makeText(WiFiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();  
                break;  
           case R.id.check://Wifi状态  
               Toast.makeText(WiFiActivity.this, "当前wifi状态为:"+mWifiAdmin.checkState(), 1).show();  
                break;  
            default:  
                break;  
            }  
        }  
          
    }  
    public void getAllNetWorkList(){  
          // 每次点击扫描之前清空上一次的扫描结果    
        if(sb!=null){  
            sb=new StringBuffer();  
        }  
        //开始扫描网络  
        mWifiAdmin.startScan();  
        list=mWifiAdmin.getWifiList();  
        if(list!=null){  
            for(int i=0;i<list.size();i++){  
                //得到扫描结果  
                mScanResult=list.get(i);  
                String macaddress=new String();
                macaddress=mScanResult.BSSID;
                new SendDateToServer(handler).SendDataToServer(macaddress);//发送到服务器,写入数据库
                sb=sb.append(mScanResult.BSSID+"  ").append(mScanResult.SSID+"   ")  
                .append(mScanResult.capabilities+"   ").append(mScanResult.frequency+"   ")  
                .append(mScanResult.level+"\n\n");
            }  
            allNetWork.setText("扫描到的wifi网络:\n"+sb.toString());
        }  
    }  
}

WiFiAdmin:

package com.example.wifiget;

import java.util.List;  

import android.content.Context;  
import android.net.wifi.ScanResult;  
import android.net.wifi.WifiConfiguration;  
import android.net.wifi.WifiInfo;  
import android.net.wifi.WifiManager;  
import android.net.wifi.WifiManager.WifiLock;  
  
public class WiFiAdmin {  
    //定义一个WifiManager对象  
    private WifiManager mWifiManager;  
    //定义一个WifiInfo对象  
    private WifiInfo mWifiInfo;  
    //扫描出的网络连接列表  
    private List<ScanResult> mWifiList;  
    //网络连接列表  
    private List<WifiConfiguration> mWifiConfigurations;  
    WifiLock mWifiLock;  
    
    
    public WiFiAdmin(Context context){  
        //取得WifiManager对象  
        mWifiManager=(WifiManager) context.getSystemService(Context.WIFI_SERVICE);  
        //取得WifiInfo对象  
        mWifiInfo=mWifiManager.getConnectionInfo();  
    }  
    //打开wifi  
    public void openWifi(){  
        if(!mWifiManager.isWifiEnabled()){  
            mWifiManager.setWifiEnabled(true);  
        }  
    }  
    //关闭wifi  
    public void closeWifi(){  
        if(!mWifiManager.isWifiEnabled()){  
            mWifiManager.setWifiEnabled(false);  
        }  
    }  
     // 检查当前wifi状态    
    public int checkState() {    
        return mWifiManager.getWifiState();    
    }    
    //锁定wifiLock  
    public void acquireWifiLock(){  
        mWifiLock.acquire();  
    }  
    //解锁wifiLock  
    public void releaseWifiLock(){  
        //判断是否锁定  
        if(mWifiLock.isHeld()){  
            mWifiLock.acquire();  
        }  
    }  
    //创建一个wifiLock  
    public void createWifiLock(){  
        mWifiLock=mWifiManager.createWifiLock("test");  
    }  
    //得到配置好的网络  
    public List<WifiConfiguration> getConfiguration(){  
        return mWifiConfigurations;  
    }  
    //指定配置好的网络进行连接  
    public void connetionConfiguration(int index){  
        if(index>mWifiConfigurations.size()){  
            return ;  
        }  
        //连接配置好指定ID的网络  
        mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId, true);  
    }  
    public void startScan(){  
        mWifiManager.startScan();  
        //得到扫描结果  
        mWifiList=mWifiManager.getScanResults();  
        //得到配置好的网络连接  
        mWifiConfigurations=mWifiManager.getConfiguredNetworks();  
    }  
    //得到网络列表  
    public List<ScanResult> getWifiList(){  
        return mWifiList;  
    }  
    //查看扫描结果  
    public StringBuffer lookUpScan(){  
        StringBuffer sb=new StringBuffer();  
        for(int i=0;i<mWifiList.size();i++){  
            sb.append("Index_" + new Integer(i + 1).toString() + ":");  
             // 将ScanResult信息转换成一个字符串包    
            // 其中把包括:BSSID、SSID、capabilities、frequency、level    
            sb.append((mWifiList.get(i)).toString()).append("\n");  
        }  
        return sb;    
    }  
    public String getMacAddress(){  
        return (mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress(); 
    }  
    public String getBSSID(){  
        return (mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();  
    }  
    public int getIpAddress(){  
        return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();  
    }  
    //得到连接的ID  
    public int getNetWordId(){  
        return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();  
    }  
    //得到wifiInfo的所有信息  
    public String getWifiInfo(){  
        return (mWifiInfo==null)?"NULL":mWifiInfo.toString();  
    }  
    //添加一个网络并连接  
    public void addNetWork(WifiConfiguration configuration){  
        int wcgId=mWifiManager.addNetwork(configuration);  
        mWifiManager.enableNetwork(wcgId, true);  
    }  
    //断开指定ID的网络  
    public void disConnectionWifi(int netId){  
        mWifiManager.disableNetwork(netId);  
        mWifiManager.disconnect();  
    }  
}

然后是安卓端的数据传输:

package com.gm.servlet;


import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import android.os.Handler;

public class SendDateToServer {
	private static String url="http://10.18.55.240:8080/ServerForGetMethod/servlet/ServerForGetMethod";
	public static final int SEND_SUCCESS=0x123;
	public static final int SEND_FAIL=0x124;
	private Handler handler;
	public SendDateToServer(Handler handler){
		this.handler=handler;
	}
	
	public void SendDataToServer(String macaddress){
		final Map<String,String>map=new HashMap<String,String>();
		map.put("macaddress", macaddress);
		new Thread(new Runnable(){
			
			public void run(){
				try{
					if(sendGetRequest(map,url,"utf-8")){
						handler.sendEmptyMessage(SEND_SUCCESS);
					}else{
						handler.sendEmptyMessage(SEND_FAIL);
					}
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}).start();
	}
	
	private boolean sendGetRequest(Map<String,String> param,String url,String encoding) throws Exception{
		
		StringBuffer sb=new StringBuffer(url);
		if(!url.equals("")&!param.isEmpty()){
			sb.append("?");
			for(Map.Entry<String, String>entry:param.entrySet()){
				sb.append(entry.getKey()+"=");
				sb.append(URLEncoder.encode(entry.getValue(),encoding));
				sb.append("&");
			}
			sb.deleteCharAt(sb.length()-1);
		}
		HttpURLConnection conn=(HttpURLConnection) new URL(sb.toString()).openConnection();
		conn.setConnectTimeout(5000);
		conn.setRequestMethod("GET");
		if(conn.getResponseCode()==200){
			return true;
		}
		return false;
	}

}

layout:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="扫描网络"
/>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打开Wifi"
/>
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭Wifi"
/>
<Button
android:id="@+id/check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Wifi状态"
/>
<TextView
android:id="@+id/allNetWork"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="当前没有扫描到Wifi网络"
/>
</LinearLayout>
</ScrollView>

WiFi权限获取:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.wifiget"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>    
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>    
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>    
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.wifiget.WiFiActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    

</manifest>


<think>好的,我现在需要在uni-app的安卓平台上通过renderjs引入并使用天地图。首先,我得了解用户的需求和现有资源。根据用户提供的引用内容,他们已经在网页使用了天地图,并且希望在app复用,避免重复购买。同时,他们提到了使用renderjs的方法,但需要注意在renderjs中不能调用uni-app的API,而且在安卓和H5上可行,不支持微信小程序。 首先,我应该回忆一下uni-app中renderjs的作用。Renderjs是一个运行在视图层的脚本,主要用于操作DOM和BOM,适合处理复杂的交互或第三方库的集成,比如地图。由于renderjs在单独的线程运行,不能直接调用uni-app的API,这意味着所有的地图逻辑都需要在renderjs中处理,与逻辑层(Vue组件)通过事件或数据通信。 接下来,我需要查阅用户提供的引用内容,特别是引用3和5,其中提到了使用renderjs引入天地图的具体问题和注意事项。比如,引用5提到的问题包括单指无法滑动地图、TypeError等,可能需要调整地图库的版本或配置。 步骤一:引入天地图API。根据引用3和5,需要正确引入天地图的JS文件。用户可能已经申请了key,但需要注意跨域问题,可能需要使用代理或正确的URL。例如,天地图的API地址是http://api.tianditu.gov.cn/api?v=4.0&tk=YOUR_KEY,需要确保在renderjs中能正确加载。 步骤二:在uni-app的vue文件中创建renderjs模块。根据引用4提到的使用renderjs引入Cesium的例子,可以类似地创建一个script标签,设置type为module,并在module中初始化地图。需要创建一个容器div,并设置其样式为固定宽高,否则地图可能无法显示。 步骤三:处理地图交互事件。由于在renderjs中,无法使用uni-app的touch事件,可能需要直接在renderjs中监听原生的touch或鼠标事件。引用5提到单指无法滑动的问题,可能是因为地图库的默认设置需要调整,或者触屏事件没有被正确处理。可能需要检查天地图API的文档,看看是否有关于移动触控的配置选项。 步骤四:处理通信。如果需要在逻辑层(Vue)获取地图的事件或数据,比如点击标记点,可以通过this.$ownerInstance.callMethod调用Vue层的方法。例如,当地图点击时,触发一个事件,将坐标传递给Vue层进行处理。 步骤五:处理兼容性和错误。引用5提到的TypeError可能由于地图API版本问题,或者某些参数未正确传入。需要确保使用的天地图API版本兼容移动,并且所有必要的参数(如center, zoom)都正确设置。此外,安卓可能需要配置WebView的硬件加速或权限,以确保地图渲染正常。 可能遇到的问题及解决方案: 1. 地图无法加载:检查key是否正确,是否有跨域问题,尝试在index.html中引入script标签,或者使用动态创建script元素的方法。 2. 触控不灵敏:确认是否在移动正确处理了touch事件,可能需要调整地图的交互配置,或检查是否有CSS样式影响触摸事件。 3. 错误提示:如Uncaught TypeError,查看具体错误位置,可能是某些参数未定义,比如地图容器未正确获取,或者API版本不兼容。 总结步骤:配置renderjs模块引入天地图库,创建地图容器,初始化地图实例,处理交互事件,并通过通信机制与Vue层交互。同时注意安卓的兼容性配置和错误处理。</think>在uni-app安卓平台上通过renderjs引入天地图,需遵循以下步骤: ### 一、基础配置 1. **申请天地图Key** 在[天地图官网](https://www.tianditu.gov.cn/)注册并获取Web服务API密钥(需选择`Web(JS API)`类型)。 2. **引入天地图JS库** 在`index.html`头部添加脚本引用(或在renderjs中动态加载): ```html <script src="http://api.tianditu.gov.cn/api?v=4.0&tk=你的密钥"></script> ``` ### 二、编写renderjs模块 ```html <template> <view class="map-container"> <!-- 地图容器需设置固定宽高 --> <div id="tdtMap" :change:prop="renderJS.initMap" class="map-view"></div> </view> </template> <script module="renderJS" lang="renderjs"> export default { mounted() { // 动态加载天地图API(可选) this.loadScript('http://api.tianditu.gov.cn/api?v=4.0&tk=你的密钥'); }, methods: { loadScript(url) { const script = document.createElement('script'); script.src = url; document.head.appendChild(script); }, initMap(newValue) { // 初始化地图 const map = new T.Map('tdtMap', { projection: 'EPSG:4326', center: new T.LngLat(116.397, 39.907), // 初始中心点 zoom: 10 }); // 添加控件 map.addControl(new T.Control.Zoom()); // 绑定事件示例 map.addEventListener('click', (e) => { this.$ownerInstance.callMethod('onMapClick', e.lnglat); }); } } } </script> <style> .map-container { width: 100vw; height: 60vh; } .map-view { width: 100%; height: 100%; } </style> ``` ### 三、逻辑层通信处理 在Vue组件中接收地图事件: ```javascript export default { methods: { // 接收renderjs传递的地图点击坐标 onMapClick(lnglat) { console.log('点击坐标:', lnglat.lng, lnglat.lat); } } } ``` ### 四、关键问题解决 1. **单指滑动失效** 需在renderjs中强制启用触控优化: ```javascript map.enableDragging(); // 确保拖动功能启用 // 添加移动兼容meta标签 document.querySelector('meta[name="viewport"]').setAttribute('content', 'user-scalable=no'); ``` 2. **TypeError: undefined错误** 检查天地图API版本,推荐使用`v4.0`稳定版。若仍报错,尝试在`mounted`生命周期添加延迟初始化: ```javascript setTimeout(() => this.initMap(), 500); // 等待API加载完成 ``` ### 五、安卓适配要点 - 在`manifest.json`中开启WebView硬件加速: ```json "app-plus": { "webView": { "hardwareAcceleration": true } } ``` - 添加必要权限: ```json "permission": { "Android": [ "<uses-permission android:name=\"android.permission.INTERNET\"/>" ] } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值