Android应用程序能否以编程方式识别设备是否位于室内。如果我的应用在室内使用GPS,则会挂起。我正在使用以下代码:
package com.first.Engagia;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class LocationView extends Activity {
public String userId;
public String appview_username;
public String appview_password;
public String userfirstname;
public String userlastname;
public String companyname;
public String AudienceFirstnameLastname;
public String LocationString;
private ProgressDialog mProgressDialog;
TextView tv;
boolean fetchedLocationStatus;
LocationManager locationManager;
LocationListener locationListener;
boolean gps_enabled = false;
boolean network_enabled = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loc);
//setting passed userId
Bundle extras = getIntent().getExtras();
if(extras != null){
this.userId = extras.getString("userId");
this.appview_username = extras.getString("username");
this.appview_password = extras.getString("password");
this.userfirstname = extras.getString("userfirstname");
this.userlastname = extras.getString("userlastname");
this.companyname = extras.getString("companyname");
this.AudienceFirstnameLastname = extras.getString("AudienceFirstnameLastname");
}
//tv = (TextView) this.findViewById(R.id.thetext);
//tv.setText("Android Geo Location Snippet Here.\n\n");
//tv.setText("");
showDialog(0);
LocationView.this.mProgressDialog.setMessage("Getting your location..." );
// Acquire a reference to the system Location Manager
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
try {
LocationView.this.gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception e) {
Log.e("LocationView", e.toString());
}
try{
LocationView.this.network_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception e) {
Log.e("LocationView", e.toString());
}
// Define a listener that responds to location updates
locationListener = new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if( displayCoordinates(location) == true ) {
//getAddress( location.getLatitude(), location.getLongitude());
Log.d("LocationView", "Before Stop Location Updates.");
stopLocationUpdates();
}
}
};
if( LocationView.this.gps_enabled == true ){
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}else if( LocationView.this.network_enabled == true ){
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}else if( LocationView.this.gps_enabled == false && LocationView.this.network_enabled == false ){
LocationUnavailable();
}
//so that the program will get the geo location once
}
public void stopLocationUpdates(){
locationManager.removeUpdates(locationListener);
}
public void LocationUnavailable(){
LocationView.this.mProgressDialog.setMessage("Location Unavailable..." );
if( LocationView.this.mProgressDialog.isShowing() ){
dismissDialog(0);
}
//go back to main_audience.html //3
Intent nextActivity = new Intent(LocationView.this, AppView.class);
nextActivity.putExtra("userId", LocationView.this.userId );
nextActivity.putExtra("username", LocationView.this.appview_username);
nextActivity.putExtra("password", LocationView.this.appview_password);
nextActivity.putExtra("userfirstname", LocationView.this.userfirstname );
nextActivity.putExtra("userlastname", LocationView.this.userlastname );
nextActivity.putExtra("companyname", LocationView.this.companyname );
nextActivity.putExtra("AudienceFirstnameLastname", LocationView.this.AudienceFirstnameLastname );
nextActivity.putExtra("latitude", "Unavailable" );
nextActivity.putExtra("longitude", "Unavailable" );
nextActivity.putExtra("origin", "LocationView" );
finish();
startActivity(nextActivity);
}
public boolean displayCoordinates(Location location){
//String txtMsg = "Latitude: " + location.getLatitude() + "\nLongitude: " + location.getLongitude();
//Toast.makeText(getBaseContext(), txtMsg, Toast.LENGTH_SHORT).show();
LocationView.this.mProgressDialog.setMessage("Location Available..." );
if( LocationView.this.mProgressDialog.isShowing() ){
dismissDialog(0);
}
//go back to main_audience.html //3
Intent nextActivity = new Intent(LocationView.this, AppView.class);
nextActivity.putExtra("userId", LocationView.this.userId );
nextActivity.putExtra("username", LocationView.this.appview_username);
nextActivity.putExtra("password", LocationView.this.appview_password);
nextActivity.putExtra("userfirstname", LocationView.this.userfirstname );
nextActivity.putExtra("userlastname", LocationView.this.userlastname );
nextActivity.putExtra("companyname", LocationView.this.companyname );
nextActivity.putExtra("AudienceFirstnameLastname", LocationView.this.AudienceFirstnameLastname );
nextActivity.putExtra("latitude", location.getLatitude() );
nextActivity.putExtra("longitude", location.getLongitude() );
nextActivity.putExtra("LocationString", LocationView.this.LocationString );
nextActivity.putExtra("origin", "LocationView" );
finish();
startActivity(nextActivity);
//this.tv.append( txtMsg );
//Toast.makeText(getBaseContext(), txtMsg, Toast.LENGTH_SHORT).show();
return true;
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case 0:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
}
最佳答案
无需检查您的设备是否在室内使用,而应检查您是否可以在一定时间内接收GPS相关的详细信息;如果无法再向用户显示某些消息,则表示此时无法访问GPS。
关于android - Android:如果设备位于室内,如何以编程方式识别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6855668/