Android: Как программно определить, находится ли устройство в помещении?

1

Возможно ли для 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;
        }
    }

}
Теги:
location
gps

1 ответ

2
Лучший ответ

Вместо того, чтобы проверять, используется ли ваше устройство в помещении или нет, проверьте, можете ли вы получать данные, связанные с GPS, в течение определенного времени; если вы не можете отобразить некоторое сообщение пользователю, говоря, что GPS недоступен на данный момент.

  • 0
    Большое спасибо за ваш ответ, у вас есть отличная идея по этому поводу, есть ли у вас пример кода для проверки того, сможете ли вы получить информацию, связанную с GPS, в течение определенного времени?
  • 1
    Простая идея заключается в том, чтобы иметь таймер и установить время, в течение запланированного времени, если вы не получите ответ, который вы искали, вы можете показать предупреждение. Проверьте, как использовать таймер в приложении.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню