解决高德地图锁屏黑屏定位不更新,高德地图绘制定位轨迹,高德定位判断定位停留点,高德地图将所有坐标绘制在可视区域内

本文章主要介绍 高德定位锁屏黑屏定位不更新的问题。

实现流程是:程序开始阶段正常执行定位,注册监听锁屏监听,唤醒cpu监听,当锁屏 广播每2秒发起一起单次定位唤醒。源码如下:

package net.tycmc.zuoyedemo;


import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationListener;


import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import net.tycmc.zuoyedemo.MainActivity.LocationReceiver;
import net.tycmc.zuoyedemo.MainActivity.Mreceiver;


public class Demo extends Activity implements AMapLocationListener{


private AlarmManager am;
 private PendingIntent pi;
 private Mreceiver mreceiver;
 private PowerManager.WakeLock wl=null;
 LocationReceiver locationReceiver;;
 @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
PowerManager pm=(PowerManager) this.getSystemService(Context.POWER_SERVICE);
wl=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"mywakrlock");
         wl.setReferenceCounted(false);
        //注册锁屏广播,主要是解决高德在锁屏黑屏情况下定位不更新的问题
         IntentFilter intentfilter=new IntentFilter();
         intentfilter.addAction(Intent.ACTION_SCREEN_ON);
         intentfilter.addAction(Intent.ACTION_SCREEN_OFF);
         intentfilter.addAction(Intent.ACTION_USER_PRESENT);
         mreceiver=new Mreceiver();
registerReceiver(mreceiver,intentfilter);

//注册设置定时唤醒定位

IntentFilter intentFile = new IntentFilter();
   intentFile.addAction("repeating");
   locationReceiver = new LocationReceiver();
   registerReceiver(locationReceiver, intentFile);
   
   //写一个定时的Pendingintent
   Intent intent = new Intent();  
   intent.setAction("repeating"); 
  
   pi = PendingIntent.getBroadcast(this, 0, intent, 0);
  am = (AlarmManager)getSystemService(ALARM_SERVICE);   
}
 private void wake() {
// TODO Auto-generated method stub
     //每2秒激活广播,发起一次定位
    // startLocation(true);
     wl.acquire();
     am.setRepeating(0, System.currentTimeMillis(),2000, pi);
}
 class LocationReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
    Log.d("sunlei","定位重新获取");
//在这里重新申请定位
   
    //locationClient.startLocation();
   
   }


   }

   public class Mreceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action =intent.getAction();
//开屏
if(Intent.ACTION_SCREEN_ON.equals(action)){
Log.d("sunlei","开屏");
}//锁屏
else if(intent.ACTION_SCREEN_OFF.equals(action)){
Log.d("sunlei","锁屏");
//如果锁屏关闭当前常规定位方法,调用alarm,每2秒发动一次单次定位
//locationClient.stopLocation();
wake();


}//解锁
else if(intent.ACTION_USER_PRESENT.equals(action)){
Log.d("sunlei","解锁");
//am.cancel(pi);
}
}

}
@Override
public void onLocationChanged(AMapLocation arg0) {
// TODO Auto-generated method stub

}


}

权限为:<uses-permission android:name="android.permission.WAKE_LOCK"/>



在 http://download.csdn.net/detail/a872822645/9495895 中有关于本程序完整源代码。包含点击打开链接

解决高德地图锁屏黑屏定位不更新,高德地图绘制定位轨迹,高德定位判断定位停留点,高德地图将所有坐标绘制在可视区域内  。直接运行可用。

PS : 本人创建了 高德Android 开发 QQ技术讨论群,群号:304478210  欢迎大家进入  。互相咨询技术问题,以及代码共享。


Android锁屏无法继续定位问题 产生问题的原因: 手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段间后会将手机进入休眠状态。此的服务以及线程等都会停止。 最近就这个问题,阅读了很多代码以及官方文档,下面就说下最近都尝试过的方式,可能其中有些您实现了,我这边没实现,望见谅。本文采用的高德定位。 一、PowerManager.WakeLock (1)直接强制当前页面cpu运行 private PowerManager pm; private PowerManager.WakeLock wakeLock; @Override public void onCreate() { super.onCreate(); //创建PowerManager对象 pm = (PowerManager) getSystemService(Context.POWER_SERVICE); //保持cpu一直运行,不管屏幕是否黑屏 wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "CPUKeepRunning"); wakeLock.acquire(); } @Override public void onDestroy() { wakeLock.release(); super.onDestroy(); } 这个写法我表示并没有什么用,并不能强制cpu持续运行。 (2)WakefulBroadcastReceiver public class WLWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // String extra = intent.getStringExtra("msg"); Intent serviceIntent = new Intent(context, MyIntentService.class); serviceIntent.putExtra("msg", extra); startWakefulService(context, serviceIntent); } } WakefulBroadcastReceiver 内部的原理也是PowerManager,注册广播8.0的请动态注册,静态没有用。广播注册完了之后,写一个服务用来与广播互动。 public class MyIntentService extends IntentService { public MyIntentService() { super("MyIntentService"); } @Override public void onCreate() { super.onCreate(); } @Override protected void onHandleIntent(@Nullable final Intent intent) { //子线程中执行 Log.i("MyIntentService", "onHandleIntent"); String extra = intent.getStringExtra("msg"); new Thread(new Runnable() { @Override public void run() { LocationUtil.getInstance().startLocation(LocationUtil.NULL, new LocationUtil.OnLocationBack() { @Override public void back(AMapLocation aMapLocation, String backString) { Log.e("定位結果", aMapLocation.getAddress()+""); 定位结果操作,我这边是把定位候保存到数据库里面。 } }); } }).start(); Log.i("MyIntentService", "onHandleIntent:"+extra); //调用completeWakefulIntent来释放唤醒锁。 // WLWakefulReceiver.completeWakefulIntent(intent); } } 注册
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值