2016-10-21 15 views
0

初心者の問題で、私はLocationListenerを実装したサービスをAndroid搭載アプリに持っています。私は、OnCreateのイベントをフックして、物事が変わったときに私の現在の位置でトースターを表示しようとしています。何らかの理由で、アプリが自分のGPSを見ていないため、GPSにアクセスできず、requestLocationUpdates関数を呼び出すと例外がスローされるという不満があります。何かアドバイスはAndroid GPSにアクセスできない

があなたの特定の質問が何であるか全くわからない

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

@Override 
public void onCreate() { 
    super.onCreate(); 
    ctx = this; 

    if (Build.VERSION.SDK_INT >= 23 && 
     ContextCompat.checkSelfPermission(ctx, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
     ContextCompat.checkSelfPermission(ctx, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000,1, this); 
     } else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){ 
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000,1, this); 
     } 
    } 

    // Toast.makeText(this, "MyService Created", Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    double latitude = 0; 
    double longitude = 0; 

    latitude = location.getLatitude(); 
    longitude =location.getLongitude(); 
    if (latitude != 0 && longitude != 0){ 
     Toast.makeText(this, "LAT and LON updated", Toast.LENGTH_LONG).show(); 
    } 
} 
+0

logcatを投稿してください。 –

+0

onLocationChangedコールバックが呼び出されていることを確認しましたか、またはあなたのアクティビティにgpsインターフェイスを実装していますか? – uelordi

+0

Googleドキュメントから:「Android 5.0(APIレベル21)以上のアプリを対象とする場合は、アプリケーションでマニフェストファイルのandroid.hardware.location.networkまたはandroid.hardware.location.gpsハードウェア機能を使用することを宣言する必要がありますあなたのアプリがNETWORK_PROVIDERまたはGPS_PROVIDERからの位置情報を受け取るかどうかによって異なります。「https://developer.android.com/guide/topics/location/strategies.html#Permission」について詳しくは、こちらをご覧ください。 – momo

答えて

0

をありがとう、私は」私は私のマニフェストでは、いくつかの他のエントリは、現在、私は(ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATIONセット)を持って行方不明です、参考になります一緒に行こう:

現在の場所が変更されたときに定期的な場所の更新を要求してトーストを表示するにはどうすればよいですか?最初

まず物事:あなたはGPSを使用したい場合は

  • マニフェストにACCESS_FINE_LOCATIONを使用することで十分です。 はありませんACCESS_COARSE_LOCATIONを指定する必要はありませんです。
  • マシュマロ以上の場合は、実行時に場所のアクセス許可を要求する必要があります。 ContextCompat.checkSelfPermission()がありますが、ユーザーの決定はどこで処理しますか(here参照)。パーミッションが決して要求されない、またはレスポンスが正しく処理されない場合、アプリは実際にパーミッションを持っておらず、あなたが経験した例外が表示されます。

上記の質問に対するもう少し詳細と解決策があります。

歴史的に、ロケーションの更新は常に、あなたがやろうとしているLocationManagerを通して取得されました。しかし、数年前から、Google Location API(hereを参照)を使用する方が良い(推奨される)方法です。 Google Location APIでは、LocationManagerよりもはるかに多くの定型句が必要です。これが私がLocationAssistantを書いた理由です。これはほとんどの作業を行うユーティリティクラスです。ここでは、LocationAssistantを使用すると、トーストを位置情報の更新を要求し、表示については行くだろうかです:

public class MyActivity extends Activity implements LocationAssistant.Listener { 

    private LocationAssistant assistant; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     // You can specify a different accuracy and interval here, depending on the needs of your app 
     assistant = new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, true); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     assistant.start(); 
    } 

    @Override 
    protected void onPause() { 
     assistant.stop(); 
     super.onPause(); 
    } 

    @Override 
    public void onNewLocationAvailable(Location location) { 
     Toast.makeText(this, location != null ? 
      "Lat: " + location.getLatitude() + " Lon: " + location.getLongitude() : 
      "Null location", 
      Toast.LENGTH_LONG).show();  } 

    ... 
} 

onNewLocationAvailable()は、最初の有効な場所が利用可能になるとすぐに起動(およびその後も定期的に要求された間隔で)されます。パーミッションが与えられていない、またはロケーションプロバイダがオフになっている状況を扱う、実装する必要のあるリスナメソッドがいくつかあります。しかし本質的にこれはそれです。

ロケーションアシスタントでは、モックの場所を確実に拒否することができます(アプリの要件の場合)。

関連する問題