Android Wifi定位
2010-08-23 01:31:00 来源:WEB开发网声明Native函数
1 JNINativeMethod AndroidRadioDataProvider::native_methods_[] = { 2 {"onUpdateAvailable", 3 "(L" GEARS_JAVA_PACKAGE "/AndroidRadioDataProvider$RadioData;J)V", 4 reinterpret_cast(AndroidRadioDataProvider::OnUpdateAvailable) 5 }, 6 }; 7
JNI调用好像只能调用静态成员函数,把对象本身用一个参数传进来,然后再调用对象的成员函数。
代码
void AndroidRadioDataProvider::OnUpdateAvailable(JNIEnv* env, jclass cls, jobject radio_data, jlong self) { assert(radio_data); assert(self); AndroidRadioDataProvider *self_ptr = reinterpret_cast(self); RadioData new_radio_data; if (InitFromJavaRadioData(env, radio_data, &new_radio_data)) { self_ptr->NewRadioDataAvailable(&new_radio_data); } }
先判断基站信息有没有变化,如果有变化则通知相关的监听者。
1 void AndroidRadioDataProvider::NewRadioDataAvailable( 2 RadioData* new_radio_data) { 3 bool is_update_available = false; 4 data_mutex_.Lock(); 5 if (new_radio_data && !radio_data_.Matches(*new_radio_data)) { 6 radio_data_ = *new_radio_data; 7 is_update_available = true; 8 } 9 // Avoid holding the mutex locked while notifying observers. 10 data_mutex_.Unlock(); 11 12 if (is_update_available) { 13 NotifyListeners(); 14 } 15 }
接下来的过程,在基站定位和WIFI定位是一样的,后面我们再来介绍。下面我们先看 WIFI定位
3.关注android平台中的WIFI变化。
JAVA类AndroidWifiDataProvider扩展了 BroadcastReceiver类,它关注WIFI扫描结果:
1 IntentFilter filter = new IntentFilter(); 2 filter.addAction(mWifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 3 mContext.registerReceiver(this, filter, null, handler);
当收到WIFI扫描结果后,调用Native函数 onUpdateAvailable,并把WIFI的扫描结果传递过去。
1 public void onReceive(Context context, Intent intent) { 2 if (intent.getAction().equals( 3 mWifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 4 if (Config.LOGV) { 5 Log.v(TAG, "Wifi scan resulst available"); 6 } 7
更多精彩
赞助商链接