百度地圖定位寫在Service裏實現

 

百度地圖定位寫在Service裏實現

分類: android 定位 後臺運行 Service 378人閱讀 評論(1) 收藏 舉報

最近在做一個定位的應用,應用是在用戶退出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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章