2016-10-18 262 views
-1

我正在做一个项目,在发生异常时需要获取GPS位置。 我如何在我的Anomaly类中的方法中调用/启动gps位置? 所以我有一个等级的异常,我已经使用这个类来获取GPS位置:Android-获取GPS位置

import android.Manifest; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.Settings; 
import android.support.v4.app.ActivityCompat; 
import android.widget.TextView; 




public class GPS extends Activity { 

    private LocationManager locationManager; 
    private LocationListener locationListener; 
    private TextView textView; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     locationListener = new LocationListener() { 


      @Override 
      public void onLocationChanged(Location location) { 
       textView.append("\n "+location.getLatitude()+" "+location.getLongitude()); 
      } 

      @Override 
      public void onStatusChanged(String provider, int status, Bundle extras) { 

      } 

      @Override 
      public void onProviderEnabled(String provider) { 

      } 

      @Override 
      public void onProviderDisabled(String provider) { 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(intent); 
      } 
     }; 


     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{ 
        Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, 
        Manifest.permission.INTERNET 
      }, 10); 
     } 
     }else { 
      updateGPS(); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode){ 
      case 10: 
       if (grantResults.length>0 && grantResults[0]== PackageManager.PERMISSION_GRANTED) 
        updateGPS(); 
     } 
    } 

    public void updateGPS() { 
     locationManager.requestLocationUpdates("gps", 3600000, 0, locationListener); 
    } 

} 

这是我的课Anormaly(我是一个初学者所以我不知道我应该延长,如果我需要开始一个新的意图)

public class Anomaly extends AppCompatActivity{ 

private GPS gps; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.data); 
} 

public void abnormalHRDetected(int heartRateInt) { 

    if (heartRateInt < 40 || heartRateInt > 120) { 
     Intent intent = new Intent(this, GPS.class); 
     startActivity(intent); 
     finish(); 
    } 
} 

这很简单。我收到心率,并将其放在屏幕“数据”上。当心率值低于40或大于120时出现异常,我想要获得GPS位置(发送到数据库不要放在屏幕上)对不起我的英语

+0

这个异常类在哪里? –

+0

更新@ Code-Apprentice –

+0

我不明白这个问题。你需要什么帮助? –

回答

-1

请参阅此链接

https://github.com/HariKrish4/TurnNavigation

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.graphics.Point; 
import android.location.Location; 
import android.os.Handler; 
import android.os.SystemClock; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import android.view.animation.Interpolator; 
import android.view.animation.LinearInterpolator; 

import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.Projection; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.CameraPosition; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.android.gms.maps.model.PolylineOptions; 

import org.json.JSONArray; 
import org.json.JSONObject; 

import java.util.ArrayList; 

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    private static final int MY_PERMISSION_ACCESS_FINE_LOCATION = 100; 
    private GoogleMap mMap; 
    ArrayList<LatLng> list = new ArrayList<>(); 
    private GoogleApiClient mGoogleApiClient; 
    private Location mLastLocation; 
    private LocationRequest mLocationRequest; 
    private Marker marker; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

     // Create an instance of GoogleAPIClient. 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(LocationServices.API) 
        .build(); 
     } 
    } 


    /** 
    * Manipulates the map once available. 
    * This callback is triggered when the map is ready to be used. 
    * This is where we can add markers or lines, add listeners or move the camera. In this case, 
    * we just add a marker near Sydney, Australia. 
    * If Google Play services is not installed on the device, the user will be prompted to install 
    * it inside the SupportMapFragment. This method will only be triggered once the user has 
    * installed Google Play services and returned to the app. 
    */ 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     getDirections(); 
    } 

    private void getDirections() { 
     // Instantiate the RequestQueue. 
     RequestQueue queue = Volley.newRequestQueue(this); 
     String url = "https://maps.googleapis.com/maps/api/directions/json?origin=triplicane,chennai&destination=saidapet,chennai&sensor=false"; 

     // Request a string response from the provided URL. 
     StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         // Display the first 500 characters of the response string. 
         try { 
          JSONObject json = new JSONObject(response); 
          JSONArray routeArray = json.getJSONArray("routes"); 
          JSONObject routes = routeArray.getJSONObject(0); 
          JSONObject overviewPolylines = routes 
            .getJSONObject("overview_polyline"); 
          String encodedString = overviewPolylines.getString("points"); 
          list = decodePoly(encodedString); 

          // Polylines are useful for marking paths and routes on the map. 
          mMap.addPolyline(new PolylineOptions().geodesic(true) 
            .addAll(list) 
          ); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 
     // Add the request to the RequestQueue. 
     queue.add(stringRequest); 
    } 

    private ArrayList<LatLng> decodePoly(String encoded) { 

     ArrayList<LatLng> poly = new ArrayList<LatLng>(); 
     int index = 0, len = encoded.length(); 
     int lat = 0, lng = 0; 

     while (index < len) { 
      int b, shift = 0, result = 0; 
      do { 
       b = encoded.charAt(index++) - 63; 
       result |= (b & 0x1f) << shift; 
       shift += 5; 
      } while (b >= 0x20); 
      int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
      lat += dlat; 

      shift = 0; 
      result = 0; 
      do { 
       b = encoded.charAt(index++) - 63; 
       result |= (b & 0x1f) << shift; 
       shift += 5; 
      } while (b >= 0x20); 
      int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
      lng += dlng; 

      LatLng p = new LatLng((((double) lat/1E5)), 
        (((double) lng/1E5))); 
      poly.add(p); 
     } 

     return poly; 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSION_ACCESS_FINE_LOCATION); 

     } else { 
      mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
        mGoogleApiClient); 
      putNavigationMarker(); 
      createLocationRequest(); 
      startLocationUpdates(); 
     } 
    } 

    private void startLocationUpdates() { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     }else { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } 
    } 

    protected void createLocationRequest() { 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10000); 
     mLocationRequest.setFastestInterval(5000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    protected void onStart() { 
     mGoogleApiClient.connect(); 
     super.onStart(); 
    } 

    protected void onStop() { 
     mGoogleApiClient.disconnect(); 
     super.onStop(); 
    } 


    private void putNavigationMarker() { 
     LatLng mapCenter = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()); 

     mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mapCenter, 13)); 

     // Flat markers will rotate when the map is rotated, 
     // and change perspective when the map is tilted. 
     marker = mMap.addMarker(new MarkerOptions() 
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_navigation_black_48dp)) 
       .position(mapCenter) 
       .flat(true) 
       .rotation(245)); 

     CameraPosition cameraPosition = CameraPosition.builder() 
       .target(mapCenter) 
       .zoom(16) 
       .bearing(90) 
       .build(); 

     // Animate the change in camera view over 2 seconds 
     mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 
       2000, null); 

    } 

    public void animateMarker(final Marker marker, final LatLng toPosition, 
           final boolean hideMarker) { 
     final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     Projection proj = mMap.getProjection(); 
     Point startPoint = proj.toScreenLocation(marker.getPosition()); 
     final LatLng startLatLng = proj.fromScreenLocation(startPoint); 
     final long duration = 500; 

     final Interpolator interpolator = new LinearInterpolator(); 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       long elapsed = SystemClock.uptimeMillis() - start; 
       float t = interpolator.getInterpolation((float) elapsed 
         /duration); 
       double lng = t * toPosition.longitude + (1 - t) 
         * startLatLng.longitude; 
       double lat = t * toPosition.latitude + (1 - t) 
         * startLatLng.latitude; 
       marker.setPosition(new LatLng(lat, lng)); 

       if (t < 1.0) { 
        // Post again 16ms later. 
        handler.postDelayed(this, 16); 
       } else { 
        if (hideMarker) { 
         marker.setVisible(false); 
        } else { 
         marker.setVisible(true); 
        } 
       } 
      } 
     }); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode) { 
      case MY_PERMISSION_ACCESS_FINE_LOCATION: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // permission was granted 
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
         // TODO: Consider calling 
         // ActivityCompat#requestPermissions 
         // here to request the missing permissions, and then overriding 
         // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
         //           int[] grantResults) 
         // to handle the case where the user grants the permission. See the documentation 
         // for ActivityCompat#requestPermissions for more details. 
         return; 
        } 
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
          mGoogleApiClient); 
        putNavigationMarker(); 
       } else { 
        // permission denied 
        finish(); 
       } 
       break; 
     } 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     mLastLocation = location; 
     LatLng mapCenter = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()); 
     animateMarker(marker,mapCenter,false); 
    } 
} 
+0

请解释这将如何帮助OP。 –

+0

@ Code-Apprentice请参考此链接https://developer.android.com/training/location/retrieve-current.html –

+2

我不是OP。我提出一个建议来改善你的答案。这个没有任何解释的代码是无益的。 –

0

确保你应该给access_gps和access_finelocation权限在您的清单文件。

下面的代码可以帮助你解决你的问题

import android.Manifest; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.Settings; 
import android.support.v4.app.ActivityCompat; 
import android.widget.TextView; 
public class GPS extends Activity { 

private LocationManager locationManager; 
private LocationListener locationListener; 
private TextView textView; 
Location cLocation; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


     @Override 
     public void onProviderDisabled(String provider) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      startActivity(intent); 
     } 
    }; 


    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     requestPermissions(new String[]{ 
       Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, 
       Manifest.permission.INTERNET 
     }, 10); 
    } 
    }else { 
     cLocation = updateGPS(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode){ 
     case 10: 
      if (grantResults.length>0 && grantResults[0]== PackageManager.PERMISSION_GRANTED) 
       cLocation = updateGPS(); //In update gps method the textview will set to current lat & long values and it returns the current location to your cLocation variable, if you wana use that values further you can use with cLocation variable. 
    } 
} 

public Location updateGPS() { 
Location currentLocation; 
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    locationListener = new LocationListener() { 


     @Override 
     public void onLocationChanged(Location location) { 
      textView.append("\n "+location.getLatitude()+" "+location.getLongitude()); 
      currentLocation = location; 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 

     } 
    locationManager.requestLocationUpdates("gps", 3600000, 0, locationListener); 
    } 
return currentLocation; 
} 

}

+0

高兴地解释了这个代码如何帮助OP。 –

+0

你在哪里隐藏类名? – Stanojkovic

-2

我建议使用下面的代码,使用接口LocationListener像一个参数。这样你就不需要像原始代码那样启动Activity来获取Location。

确保您在清单文件上赋予ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION和ACCESS_NETWORK_STATE权限。

public class LocationSuporte 
{ 
    private LocationListener mLocationListener; 
    private final static String TAG = "Location Suporte"; 
    private Context mContext; 


    public LocationSuporte(Context mContext, LocationListener mLocationListener) { 
     this.mLocationListener = mLocationListener; 
     this.mContext = mContext; 
    } 

    public boolean isGPSEnable() { 
     LocationManager lManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 
     return lManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || lManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    } 


    public boolean isNetworkAvailable() { 
     final ConnectivityManager connectivityManager = ((ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE)); 
     return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); 
    } 

    public Location getLocation() { 
     Location location = null; 
     LocationManager lManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 

     if (ActivityCompat.checkSelfPermission(mContext, 
                 Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
                 ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != 
                 PackageManager.PERMISSION_GRANTED){ 

      return null; 
     } 

     try { 
      boolean isGPSEnabled = this.isGPSEnable(); 
      Log.d(TAG, "isGPSEnabled = " + isGPSEnabled); 

      boolean isNetworkEnabled = isNetworkAvailable(); 
      Log.d(TAG, "isNetworkEnabled = " + isNetworkEnabled); 

      if (isNetworkEnabled) { 
       lManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1, 1, this.mLocationListener); 
       if (lManager != null) { 
        location = lManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
       } 
      } 

      if (isGPSEnabled && location == null) { 
       lManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, this.mLocationListener); 
       Log.d("GPS Enabled", "GPS Enabled"); 
       if (lManager != null) { 
        location = lManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
       } 
      } 

     } catch (Exception e) {    
      e.printStackTrace(); 
     } 
     lManager.removeUpdates(this.mLocationListener); 
     return location; 
    }  
} 

使用示例;

public void abnormalHRDetected(int heartRateInt) 
{ 
    if (heartRateInt < 40 || heartRateInt > 120) { 
      Location location = new LocationSuporte(getApplicationContext(), new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       Log.d("EXAMPLE","onLocationChanged"); 
      } 

      @Override 
      public void onStatusChanged(String s, int i, Bundle bundle) { 
       Log.d("EXAMPLE","onStatusChanged"); 
      } 

      @Override 
      public void onProviderEnabled(String s) { 
       Log.d("EXAMPLE","onProviderEnabled"); 

      } 

      @Override 
      public void onProviderDisabled(String s) { 
       Log.d("EXAMPLE","onProviderDisabled"); 
      } 
     }).getLocation(); 

     Log.d("EXAMPLE","\n "+location.getLatitude()+" "+location.getLongitude()); 
    } 
} 
+0

请详细解释他解决OP的问题。另外,请提供所需的特定权限。 –

+0

编辑您的问题以改进它。 –

+0

必要的权限是 ACCESS_FINE_LOCATION ACCESS_NETWORK_STATE ACCESS_COARSE_LOCATION 我只是建议另辟蹊径,走位置我不理解你的需求究竟是什么。 –