/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package my.home.lehome.service; import android.app.IntentService; import android.content.Intent; import android.text.TextUtils; import android.util.Log; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import my.home.common.util.ComUtil; import my.home.common.util.PrefUtil; import my.home.lehome.R; import my.home.lehome.activity.MainActivity; import my.home.lehome.helper.MessageHelper; /** * Created by legendmohe on 15/5/23. */ public class LocationIntentService extends IntentService { public final static String TAG = "LocationIntentService"; private Object mSyncObject = new Object(); private LocationClient mLocationClient = null; private BDLocation mCurLocation = null; private BDLocationListener mMyListener = new MyLocationListener(); public LocationIntentService() { super("LocationIntentService"); } @Override public void onCreate() { super.onCreate(); initLocationClient(); } private void initLocationClient() { Log.d(TAG, "initLocationClient"); LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置定位模式 option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02 option.setIsNeedAddress(true); option.setOpenGps(true); option.setNeedDeviceDirect(false);//返回的定位结果包含手机机头的方向 mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.setLocOption(option); mLocationClient.registerLocationListener(mMyListener); } private void cleanup() { Log.d(TAG, "cleanup"); mLocationClient.unRegisterLocationListener(mMyListener); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand."); return super.onStartCommand(intent, flags, startId); } @Override protected void onHandleIntent(Intent intent) { Log.d(TAG, "handle new location request."); int seq = intent.getIntExtra("seq", -1); String type = intent.getStringExtra("type"); String id = intent.getStringExtra("id"); if (TextUtils.isEmpty(type) || TextUtils.isEmpty(id)) { Log.d(TAG, "LocationIntentService got invaild intent."); return; } synchronized (mSyncObject) { if (mLocationClient != null) { while(mCurLocation == null) { int retCode = mLocationClient.requestLocation(); Log.d(TAG, "mLocationClient.requestLocation() retCode:" + retCode); try { mSyncObject.wait(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } if (type.equals("req_loc")) { if (MainActivity.VISIBLE || !PrefUtil.getbooleanValue(getApplicationContext(), "pref_loc_me_silent_enable", false)) { MessageHelper.sendServerMsgToList(seq, "client", getString(R.string.loc_sending_loc), getApplicationContext()); } sendResultToServer(formatLocationResponse(id)); } else if (type.equals("req_geo")) { // do nothing now, maybe show some log Log.d(TAG, "get geo location, now send result to server."); sendResultToServer(formatGeoResponse(id)); } mCurLocation = null; Log.d(TAG, "LocationIntentService exit intent."); } private void sendResultToServer(String broadcast) { MessageHelper.sendBackgroundMsgToServer(getApplicationContext(), broadcast); } private String formatLocationResponse(String id) { StringBuilder builder = new StringBuilder("@"); // broadcast indicator builder.append(id).append("|"); if (TextUtils.isEmpty(mCurLocation.getAddrStr()) || mCurLocation.getAddrStr().equals("null")) { mCurLocation.setAddrStr(getString(R.string.loc_no_addr, id)); } builder.append(mCurLocation.getAddrStr()).append("|"); if (TextUtils.isEmpty(mCurLocation.getAddrStr())) { mCurLocation.setLatitude(-1.0); } builder.append(mCurLocation.getLatitude()).append("|"); if (TextUtils.isEmpty(mCurLocation.getAddrStr())) { mCurLocation.setLongitude(-1.0); } builder.append(mCurLocation.getLongitude()); return builder.toString(); } private String formatGeoResponse(String id) { StringBuilder builder = new StringBuilder("^"); // report indicator builder.append(id).append("|"); if (TextUtils.isEmpty(mCurLocation.getAddrStr()) || mCurLocation.getAddrStr().equals("null")) { mCurLocation.setAddrStr(getString(R.string.loc_no_addr, id)); } builder.append(mCurLocation.getAddrStr()).append("|"); if (TextUtils.isEmpty(mCurLocation.getAddrStr())) { mCurLocation.setLatitude(-1.0); } builder.append(mCurLocation.getLatitude()).append("|"); if (TextUtils.isEmpty(mCurLocation.getAddrStr())) { mCurLocation.setLongitude(-1.0); } builder.append(mCurLocation.getLongitude()).append("|"); builder.append(ComUtil.getTimestamp()); return builder.toString(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); mLocationClient.start(); } @Override public void onDestroy() { cleanup(); mLocationClient.stop(); super.onDestroy(); } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { LocationIntentService.this.mCurLocation = location; synchronized (LocationIntentService.this.mSyncObject) { LocationIntentService.this.mSyncObject.notifyAll(); } StringBuffer sb = new StringBuffer(256); sb.append("time : "); sb.append(location.getTime()); sb.append("\nerror code : "); sb.append(location.getLocType()); sb.append("\nlatitude : "); sb.append(location.getLatitude()); sb.append("\nlontitude : "); sb.append(location.getLongitude()); sb.append("\nradius : "); sb.append(location.getRadius()); sb.append("\ntype : "); sb.append(location.getLocType()); if (location.getLocType() == BDLocation.TypeGpsLocation) { sb.append("\nspeed : "); sb.append(location.getSpeed()); sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { sb.append("\naddr : "); sb.append(location.getAddrStr()); } Log.d(TAG, sb.toString()); } } }