2017-10-14 6 views
1

LocationListenerを使用してGPS速度を取得しようとしています。LocationListenerに速度の更新がありません

最初にアプリを起動するときに許可を求めます。許可が与えられ、「onLocationChanged()」はトーストをすぐに表示しますが、もう一度表示しません。

私は自分の携帯電話でロケーションを有効にしています。 しかし、私はこれ以上位置情報を更新しません。

私のコードをすべてダンプして申し訳ありませんが、何を表示するのかは分かりません。

私がここで紛失していることを知っている人はいますか? "onLocationChanged()"

package com.example.username.yaddayadda; 

import android.Manifest; 
import android.annotation.TargetApi; 
import android.app.Activity; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.location.LocationManager; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.location.GpsStatus; 
import android.location.LocationListener; 
import android.location.Location; 
import android.widget.Toast; 
import java.util.Formatter; 
import java.util.Locale; 

@TargetApi(23) 
public class MainActivity extends Activity implements LocationListener{ 

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

    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

    try { 
     if (checkIfPermissionIsGranted()){ 
      Toast toast = Toast.makeText(getApplicationContext(), "Permission is granted for fine and coarse location", Toast.LENGTH_LONG); 
      toast.show(); 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 
     } 
     else { 
      ActivityCompat.requestPermissions(this, new String[] { 
          Manifest.permission.ACCESS_FINE_LOCATION, 
          Manifest.permission.ACCESS_COARSE_LOCATION }, 
        1); 

      if(checkIfPermissionIsGranted()){ 
       Toast toast = Toast.makeText(getApplicationContext(), "Permission was granted for fine and coarse location", Toast.LENGTH_LONG); 
       toast.show(); 

       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
       locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 
      } else { 
       Toast toast = Toast.makeText(getApplicationContext(), "Permission was denied for fine and coarse location", Toast.LENGTH_LONG); 
       toast.show(); 
      } 
     } 
    } catch(SecurityException e){ 
     Context context = getApplicationContext(); 
     CharSequence text = "Got exception: \n" + e.getMessage(); 
     int duration = Toast.LENGTH_LONG; 

     Toast toast = Toast.makeText(context, text, duration); 
     toast.show(); 
    } 
    this.onLocationChanged(null); 
} 

private boolean checkIfPermissionIsGranted(){ 
    return (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
      && ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED); 
} 

@Override 
public void onLocationChanged(Location location) { 
    TextView txt = (TextView) this.findViewById(R.id.txtCurrentSpeed); 
    Toast toast = Toast.makeText(getApplicationContext(), "onLocationChanged()", Toast.LENGTH_SHORT); 
    toast.show(); 

    if(location==null){ 
     txt.setText("-.- m/s"); 
    } 
    else { 
     if(location.hasSpeed()){ 
      float nCurrentSpeed = location.getSpeed(); 
      txt.setText(nCurrentSpeed + " m/s"); 
     } else { 
      txt.setText("0.0 m/s"); 
     } 
    } 
} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    Toast toast = Toast.makeText(getApplicationContext(), "onStatusChanged()", Toast.LENGTH_SHORT); 
    toast.show(); 
} 

@Override 
public void onProviderEnabled(String provider) { 
    Toast toast = Toast.makeText(getApplicationContext(), "onProviderEnabled()", Toast.LENGTH_SHORT); 
    toast.show(); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    Toast toast = Toast.makeText(getApplicationContext(), "onProviderdisabled()", Toast.LENGTH_SHORT); 
    toast.show(); 
} 
} 

enter image description here enter image description here

答えて

3

はすぐに、決して再びトーストを示しています。

あなたは任意の場所の更新を受信して​​いないが、あなたはこの関数を呼び出している自分がここに

// toast because of this , so no need of this , remove this call 
this.onLocationChanged(null); 

しかし、私はこれ以上の場所の更新を得ることはありません。

初めてアクセス権が与えられた後、許可が与えられると、ロケーション要求コードをonRequestPermissionsResultから再度実行する必要があります。

ですから、onRequestPermissionsResultをオーバーライドする必要があるとあなたが

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 1: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // location-related task you need to do. 
       if (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 

        //Request location updates: 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 1000*60, this); 
       } 

      } else { 

       // permission denied, Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

    } 
} 

ノートのように再びrequestLocationUpdatesを許可をおろした後:それは理想的なだけで最適なものを使用して、あなたの場所を移動することができ、両方のプロバイダと場所を要求しますコードを別の機能に要求し、必要に応じていつでも呼び出すことができます。

リファレンス

getBestLocation()

+0

ありがとうございます! onRequestPermissionsResultは私が必要としていたものでした! – Starstepper

+0

@Starstepper私は、私は、ハッピーコーディングを助けることができるとうれしい –

関連する問題