看到 LocationManager
大家可能都可以猜到我想幹嘛
Fack GPS之類的APP都是透過 Mock Location去達到改變位置的效果
我就想從LocationManager 去著手,想從GPS晶片上來的路中做修改。
目前研究到 LocationManager有綁定到一個名為 LocationManagerService的物件
中間的介面為 ILocationManager
在LocationManager裡有一個mService物件 形態為ILocationManaer
從別人的分析中找到 這個Interface中有一個很重要的Method是
reportLocation 對應於 gps_location_callback
也就是從他開始把GPS位置往上傳遞到各個 LocationListener
幾個關鍵方法
ListenerTransport transport = wrapListener(listener, looper);
//其中的一個function
@Override
public void onLocationChanged(Location location) {
Message msg = Message.obtain();
msg.what = TYPE_LOCATION_CHANGED;
msg.obj = location;
mListenerHandler.sendMessage(msg);
}
mService.requestLocationUpdates(request, transport(上面的物件), intent, packageName);
mService中
public void reportLocation(Location location ,boolean){
//略過部分
if(mContext.checkCallingOrSelfPermission(
INSTALL_LOCATION_PROVIDER
)!=PcakagerManager.PERMISSION_GRANTER){
throw new SecurityException("Requires INSTALL_LOCATION_
PROVIDER permission")
}
Message m = Message.obtain(mLocationHandler,MESSAGE_LOCATION_CHANGED,location);
}
由此得知,透過reportLocation 可以將坐標傳往所有註冊的locationlistener
不過當我找到 reportLocation 並且呼叫他之後
出現了
Requires INSTALL_LOCATION_PROVIDER permission
也就是上面那個IF的內容QQ
那我現在是改成找到Handler ...
並且Message m = Message.obtain(mLocationHandler,MESSAGE_LOCATION_CHANGED,location);
成功的機會比較大嗎QQ
(苦惱
避免誤會
我的權限內有加上
<uses-permission
android:name="android.permission.INSTALL_LOCATION_PROVIDER"></uses-permission>