Java Android:addProximityAlert LocationManager方法不';不要发送广播
我正在一个Android项目中工作,我使用AddProximityAlert方法,因为您已经知道,该方法允许您为位置(纬度、经度)和给定半径给定的位置设置接近警报,并通知您是否离它如此近 三天前我一直在研究这个问题,我一次又一次地遇到同样的问题 这是我的简单代码。 #MainActivity.javaJava Android:addProximityAlert LocationManager方法不';不要发送广播,java,android,locationmanager,proximitysensor,Java,Android,Locationmanager,Proximitysensor,我正在一个Android项目中工作,我使用AddProximityAlert方法,因为您已经知道,该方法允许您为位置(纬度、经度)和给定半径给定的位置设置接近警报,并通知您是否离它如此近 三天前我一直在研究这个问题,我一次又一次地遇到同样的问题 这是我的简单代码。 #MainActivity.java #ProximityReceiver.java *#问题是当我运行程序时,系统从未调用过BroadcastReceiver(ProximityReciever),即使我非常接近proximit
#ProximityReceiver.java
*#问题是当我运行程序时,系统从未调用过BroadcastReceiver(ProximityReciever),即使我非常接近proximit点,即使调试器告诉我两个位置之间的距离<1000m:///p>我刚刚弄明白了关于这个主题的一些事情,以及为什么addProximityAlert sames不起作用,我也要与您分享这一点,因为我注意到有些人以前问过同样的问题,他们没有得到任何答案 答案就在我面前,但我没有注意到,所以当我阅读Android Officel文档()时,我看到了这句话“由于位置估计的近似性质,如果设备短暂通过给定区域,可能不会触发任何意图”” 这是什么意思?这意味着当你在AVD上测试你的应用程序时,你从DDMS向AVD发送一个gps坐标(纬度、经度),这真的很难做到 模拟gps的真实情况(因为首先你选择一个点作为你的近景点,然后你选择一个离近景点很远的点,看它是否工作),而这不是真实设备的情况 因此,解决方案是在真正的设备上测试你的应用程序,或者使用DDM尝试非常缓慢地更改坐标,直到你进入想要的区域
package com.example.proximityalert;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity implements LocationListener {
LocationManager lm;
//Defining Latitude & Longitude
double lat=37.422006 ,long1=-122.084095;
//Defining Radius
float radius=1000;
//Intent Action
String ACTION_FILTER = "com.example.proximityalert";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//i'm registering my Receiver First
registerReceiver(new ProximityReciever(), new IntentFilter(ACTION_FILTER));
//i'm calling ther service Location Manager
lm=(LocationManager) getSystemService(LOCATION_SERVICE);
//for debugging...
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, this);
//Setting up My Broadcast Intent
Intent i= new Intent(ACTION_FILTER);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), -1, i, 0);
//setting up proximituMethod
lm.addProximityAlert(lat, long1, radius, -1, pi);
}
@Override
//just For debugging to See the distance between my actual position and the aproximit point
public void onLocationChanged(Location newLocation) {
Location old = new Location("OLD");
old.setLatitude(lat);
old.setLongitude(long1);
double distance = newLocation.distanceTo(old);
Log.i("MyTag", "Distance: " + distance);
}
@Override
public void onProviderDisabled(String arg0) {}
@Override
public void onProviderEnabled(String arg0) {}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}
}
package com.example.proximityalert;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.util.Log;
import android.widget.Toast;
public class ProximityReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Key for determining whether user is leaving or entering
String key = LocationManager.KEY_PROXIMITY_ENTERING;
//Gives whether the user is entering or leaving in boolean form
boolean state = intent.getBooleanExtra(key, false);
if(state){
// Call the Notification Service or anything else that you would like to do here
Log.i("MyTag", "Welcome to my Area");
Toast.makeText(context, "Welcome to my Area", Toast.LENGTH_SHORT).show();
}else{
//Other custom Notification
Log.i("MyTag", "Thank you for visiting my Area,come back again !!");
Toast.makeText(context, "Thank you for visiting my Area,come back again !!", Toast.LENGTH_SHORT).show();
}
}
}