2011-07-28 80 views
1

Android應用程序是否可以通過程序識別設備是否位於室內。如果在室內使用GPS,我的應用會掛起。我使用下面的代碼:Android:如何以編程方式識別設備是否位於室內?

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; 
     } 
    } 

} 

回答

2

不是檢查設備是否正在使用室內與否,檢查是否可以收到一定的時間內,GPS的相關細節;如果你不能,那麼顯示一些消息給用戶,說在這一點上GPS是不可訪問的。

+0

非常感謝您的回覆,您對此有了很好的想法,您是否有示例代碼來檢查您是否可以在特定時間內收到與GPS相關的詳細信息? – Emkey

+1

一個簡單的想法是,如果你沒有得到你正在尋找的答案,你可以在預定的時間內設置一個計時器並設置時間,你可以顯示一條提示信息。檢查如何在應用程序中使用計時器。 – sat

+0

感謝您的想法坐了,現在我明白了! :) – Emkey

相關問題