Android 如何在GPS和网络提供商之间切换?
在我的应用程序中,我想使用两个位置提供商 这意味着,如果gps被禁用,我希望我的应用程序切换到网络,并在启用gps后将其切换回网络 我使用两个LocationListener来处理这两个请求Android 如何在GPS和网络提供商之间切换?,android,networking,gps,location,Android,Networking,Gps,Location,在我的应用程序中,我想使用两个位置提供商 这意味着,如果gps被禁用,我希望我的应用程序切换到网络,并在启用gps后将其切换回网络 我使用两个LocationListener来处理这两个请求 public void onStatusChanged(String provider, int status,Bundle extras) switch (status) { case LocationProvider.TEMPORARILY_UNAVAILABLE:
public void onStatusChanged(String provider, int status,Bundle extras)
switch (status) {
case LocationProvider.TEMPORARILY_UNAVAILABLE:
......
break;
case LocationProvider.OUT_OF_SERVICE
.....
break;
case LocationProvider.AVAILABLE
.....
break;
}
在每个侦听器中,我在onStatusChanged()
中检测这些状态。
事实证明,这种方法将用于第一次更改(禁用的网络),但当我再次启用网络时,它什么也没有显示。为什么?侦听器不会一直检测到状态
请帮助我,这将是最好的张贴在代码你的解决方案…谢谢 你的答案在这里。在这个例子中,Fedor很好地解释了如何在位置提供者之间切换
谢谢。我就是这么做的:
public class LocationActivity extends Activity implements LocationListener{
private TextView latituteField;
private TextView longitudeField;
private LocationManager locationManager;
private String provider;
private TextView outputField;
private Location location;
private ScrollView scrollView;
private Criteria criteria;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
latituteField = (TextView) findViewById(R.id.lat_textView);
longitudeField = (TextView) findViewById(R.id.long_textView);
outputField = (TextView) findViewById(R.id.output_textView);
scrollView = (ScrollView) findViewById(R.id.scrollView1);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
List<String> providers = locationManager.getProviders(criteria, true);
outputField.append("Providers available..." + "\n");
for (String provider : providers) {
outputField.append(provider + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
provider = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(provider, 400, 1, this);
if (provider != null) {
outputField.append("Provider " + provider + " has been selected." + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
if (location != null) {
onLocationChanged(location);
} else {
latituteField.setText("Location not available");
longitudeField.setText("Location not available");
}
} else {
outputField.append("No provider selected" + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
}
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
double lat =location.getLatitude();
double lng =location.getLongitude();
latituteField.setText(String.valueOf(lat));
longitudeField.setText(String.valueOf(lng));
outputField.append("New Location: " + String.valueOf(lat) + " " + String.valueOf(lng) + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
@Override
public void onProviderDisabled(String dProvider) {
outputField.append("Provider " + dProvider + " has been disabled." + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
provider = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(provider, 400, 1, this);
if (provider != null) {
outputField.append("Provider " + provider + " has been selected." + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
if (location != null) {
onLocationChanged(location);
} else {
latituteField.setText("Location not available");
longitudeField.setText("Location not available");
}
} else {
outputField.append("No provider selected" + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
}
@Override
public void onProviderEnabled(String eProvider) {
outputField.append("Provider " + eProvider + " has been enabled." + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
provider = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(provider, 400, 1, this);
if (provider != null) {
outputField.append("Provider " + provider + " has been selected." + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
if (location != null) {
onLocationChanged(location);
} else {
latituteField.setText("Location not available");
longitudeField.setText("Location not available");
}
} else {
outputField.append("No provider selected" + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
outputField.append("Provider " + provider + " status changed to: " + Integer.toString(status) + "\n");
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
}
公共类LocationActivity扩展活动实现LocationListener{
私有文本视图latituteField;
私有文本视图纵向字段;
私人场所经理场所经理;
私有字符串提供者;
私有文本视图输出字段;
私人位置;
私有滚动视图滚动视图;
私人准则;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_位置);
LattuteField=(TextView)findViewById(R.id.lat_TextView);
longitudeField=(TextView)findViewById(R.id.long\u TextView);
outputField=(TextView)findViewById(R.id.output\u TextView);
scrollView=(scrollView)findViewById(R.id.scrollView1);
locationManager=(locationManager)getSystemService(Context.LOCATION\u服务);
标准=新标准();
标准.设定准确度(标准.准确度/精细度);
List providers=locationManager.getProviders(标准,true);
append(“提供程序可用…”+“\n”);
for(字符串提供程序:提供程序){
追加(提供程序+“\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
provider=locationManager.getBestProvider(标准,true);
locationManager.requestLocationUpdates(提供者,400,1,this);
if(提供程序!=null){
outputField.append(“提供程序”+提供程序+”已被选中。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
如果(位置!=null){
onLocationChanged(位置);
}否则{
latituteField.setText(“位置不可用”);
longitudeField.setText(“位置不可用”);
}
}否则{
append(“未选择提供程序”+“\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
}
@凌驾
受保护的void onResume(){
super.onResume();
locationManager.requestLocationUpdates(提供者,400,1,this);
}
受保护的void onPause(){
super.onPause();
locationManager.RemoveUpdate(此);
}
@凌驾
已更改位置上的公共无效(位置){
双纬度=location.getLatitude();
double lng=location.getLongitude();
latituteField.setText(String.valueOf(lat));
longitudeField.setText(字符串值(lng));
append(“新位置:”+String.valueOf(lat)+“+String.valueOf(lng)+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
@凌驾
公共无效onProviderDisabled(字符串dProvider){
append(“提供程序”+dProvider+”已被禁用。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
provider=locationManager.getBestProvider(标准,true);
locationManager.requestLocationUpdates(提供者,400,1,this);
if(提供程序!=null){
outputField.append(“提供程序”+提供程序+”已被选中。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
如果(位置!=null){
onLocationChanged(位置);
}否则{
latituteField.setText(“位置不可用”);
longitudeField.setText(“位置不可用”);
}
}否则{
append(“未选择提供程序”+“\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
}
@凌驾
公共无效onProviderEnabled(字符串eProvider){
append(“提供程序”+eProvider+”已启用。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
provider=locationManager.getBestProvider(标准,true);
locationManager.requestLocationUpdates(提供者,400,1,this);
if(提供程序!=null){
outputField.append(“提供程序”+提供程序+”已被选中。“+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
如果(位置!=null){
onLocationChanged(位置);
}否则{
latituteField.setText(“位置不可用”);
longitudeField.setText(“位置不可用”);
}
}否则{
append(“未选择提供程序”+“\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
outputField.append(“提供程序”+提供程序+”状态更改为“+Integer.toString(状态)+”\n”);
scrollView.fullScroll(scrollView.FOCUS\u向下);
}
}
我认为Fedor的工作刚刚确定了在初始化阶段可以使用哪个提供者。你是说我应该新建一个线程来检测isProviderEnabled
?好的,在这里看看我的答案。谢谢,你的代码提示我应该启动一个线程来检查连接。伙计们,新的解决方案