最近在做一個定位的應用,應用是在用戶退出activity時仍能實現定位功能,這時想大家都會寫在Service裏,但是百度給的api和SDK都沒有寫在服務裏的例子,剛開始我也是像寫在activity裏一樣,可是老是報錯,後來就換了百度的定位SDK,這個SDK也不能實現寫在Service裏,搞了一整天也沒出來,網上也沒有這方面的例子什麼的,後來我想百度API出來這麼久肯定有實現的方法吧,定位SDK剛出來沒多久吧,所以還是轉戰了API
我劈開原來項目的複雜代碼,寫了個簡單的Service測試,果然定位成功了,下面看源代碼:
這個是百度給的demo其中一個類:沒改動
public class BMapApiDemoApp extends Application {
static BMapApiDemoApp mDemoApp;
//百度MapAPI的管理類
BMapManager mBMapMan = null;
// 授權Key
// TODO: 請輸入您的Key,
// 申請地址:http://dev.baidu.com/wiki/static/imap/key/
String mStrKey = "DF48619AD3E2DA5B3E0CAA8575DF9038035E1506";
boolean m_bKeyRight = true;// 授權Key正確,驗證通過
// 常用事件監聽,用來處理通常的網絡錯誤,授權驗證錯誤等
static class MyGeneralListener implements MKGeneralListener {
@Override
public void onGetNetworkState(int iError) {
Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(), "您的網絡出錯啦!",
Toast.LENGTH_LONG).show();
}
@Override
public void onGetPermissionState(int iError) {
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
// 授權Key錯誤:
Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(),
"請在BMapApiDemoApp.java文件輸入正確的授權Key!",
Toast.LENGTH_LONG).show();
BMapApiDemoApp.mDemoApp.m_bKeyRight = false;
}
}
}
@Override
public void onCreate() {
mDemoApp = this;
mBMapMan = new BMapManager(this);
mBMapMan.init(this.mStrKey, new MyGeneralListener());
super.onCreate();
}
@Override
//建議在您app的退出之前調用mapadpi的destroy()函數,避免重複初始化帶來的時間消耗
public void onTerminate() {
// TODO Auto-generated method stub
if (mBMapMan != null) {
mBMapMan.destroy();
mBMapMan = null;
}
super.onTerminate();
}
}
這個是自己寫的MainActivity,程序開始運行的類,在這個類裏跳轉到定位的Service裏
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent();
intent.setClass(MainActivity.this,TestService.class);
startService(intent);
// this.finish();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();
if (!app.m_bKeyRight) {
TextView text = (TextView)findViewById(R.id.location);
text.setText("請在BMapApiDemoApp.java文件輸入正確的授權Key!\r\n" +
"申請地址:http://dev.baidu.com/wiki/static/imap/key/");
text.setTextColor(Color.RED);
}
super.onResume();
}
@Override
// 建議在APP整體退出之前調用MapApi的destroy()函數,不要在每個activity的OnDestroy中調用,
// 避免MapApi重複創建初始化,提高效率
protected void onDestroy() {
BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();
if (app.mBMapMan != null) {
app.mBMapMan.destroy();
app.mBMapMan = null;
}
super.onDestroy();
}
這個是我寫的測試類,實現定位功能的Service
public class TestService extends Service{
LocationListener mLocationListener = null;//create時註冊此listener,Destroy時需要Remove
@Override
public void onCreate() {
BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();
if (app.mBMapMan == null) {
app.mBMapMan = new BMapManager(getApplication());
app.mBMapMan.init(app.mStrKey, new BMapApiDemoApp.MyGeneralListener());
}
app.mBMapMan.start();
// 註冊定位事件
mLocationListener = new LocationListener(){
@Override
public void onLocationChanged(Location location) {
if(location != null){
String strLog = String.format("您當前的位置:\r\n" +
"緯度:%f\r\n" +
"經度:%f",
location.getLongitude(), location.getLatitude());
Toast.makeText(TestService.this, strLog, Toast.LENGTH_LONG).show();
System.out.println("dsds:"+strLog);
}
}
};
super.onCreate();
}
@Override
public void onDestroy() {
BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();
// 移除listener
app.mBMapMan.getLocationManager().removeUpdates(mLocationListener);
app.mBMapMan.stop();
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();
// 註冊Listener
app.mBMapMan.getLocationManager().requestLocationUpdates(mLocationListener);
app.mBMapMan.start();
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
在這個類裏做了些轉換,比如在activity裏寫在onPause代碼裏的我寫在了onDestroy(),onResume()裏的寫在了onStart
程序第一次執行沒問題,可以定位,可以Toast出來和打印出來,這時候Service是在後臺運行的,這時如果你再發布的話,可能粗問題,就是空指針的問題,這個問題應該奧解決,我現在還沒解決,不過大的問題解決了,就是定位可以寫在Service裏。明天再完善
用到的第三方工具是baidumapapi.jar和 libBMapApiEngine.so