2016-02-03 24 views
5

私は現在、ユーザーの現在地の緯度と経度を取得しようとしています。マニフェストで次の権限を有効にしました。 TargetSDKと分のSDKには、私は、私は権限のためのランタイムチェックを実行する必要があることを理解そうするためには23ACCESS_FINE_LOCATIONはマニフェストで付与されていますが、常にアクセス許可が拒否されていますか?

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.name.app"> 


<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <supports-screens 
     android:anyDensity="true" 
     android:largeScreens="true" 
     android:normalScreens="true" 
     android:smallScreens="false" /> 


    <activity 
     android:name=".SplashScreen" 
     android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".MainMenu" /> 
    <activity 
     android:name=".NeedToKnow" /> 
    <activity 
     android:name=".SelectTopic" /> 
    <activity 
     android:name=".DisplayTopicInformation"/> 
    <activity 
     android:name=".SelectCheckList" /> 
    <activity 
     android:name=".ViewCheckList"/> 
    <activity 
     android:name=".FindLocation"></activity> 
</application> 

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


</manifest> 

です。しかし、私が次のことを実行するとき、私は常に-1を返します。 (PERMISSION_DENIED)

int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), 
      Manifest.permission.ACCESS_FINE_LOCATION); 

現在の場所にアクセスしようとするとステップがありますか?

完全なコードはここにある:

private String getZipcodeFromCurrentLocation() { 

    int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), 
      Manifest.permission.ACCESS_FINE_LOCATION); 

    String zip = null; 
    Location location = null; 
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      latitude = location.getLatitude(); 
      longitude = location.getLongitude(); 

      Log.i("updated lat", String.valueOf(latitude)); 
      Log.i("updated lng", String.valueOf(longitude)); 
     } 


    }; 

    try { 
     if (PackageManager.PERMISSION_GRANTED == permissionCheck) { 
      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
     } 

    } catch (SecurityException e){ 
     e.printStackTrace(); 
    } 
    return zip; 

} 
+0

マニフェスト全体を投稿してください。また、あなたの 'targetSdkVersion'とは何ですか?あなたはAndroidのどのバージョンをテストしていますか? – CommonsWare

+0

ランタイムチェックの理由は、ユーザーが場所を完全に無効にすることや、場所を必要とするアプリケーションへのアクセスを拒否できることです。それらのどちらかのケースですか? –

+0

@CommonsWare私はマニフェスト – Airagale

答えて

8

ユーザーが携帯電話の設定でアプリの無効場所権を持っている場合、あなたはその許可を要求する必要があります。以下に、コードのサンプルコードを示します。

import android.Manifest; 
import android.app.Activity; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 

public class MyActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     boolean permissionGranted = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; 

     if(permissionGranted) { 
      // {Some Code} 
     } else { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 200); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case 200: { 
       if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // {Some Code} 
       } 
      } 
     } 
    } 
} 

また、上記のすべてを処理するクラスを作成し、ユーザーの場所も返します。リンクはhttps://www.dropbox.com/s/2mkyjok6mpna2yw/GPS.java?dl=0です。

+1

ようこそ、質問にお答えいただきありがとうございます。コードに加えて、回答に文脈を追加してください。 –

+0

私はすぐに出発する必要があるので、私はこの解決策を試す必要があります。アーノルドの私の質問は、ユーザーが自分の位置情報サービスをオフにしていないことを確認することですか?マニフェストには使用許可がありますか? – Airagale

+0

マニフェストファイルは問題ありません。何も追加または削除する必要はありません(アプリケーションタグの前にパーミッションタグを入れても問題はないかどうかは分かりません)。まず、ユーザーがロケーションサービスを有効にしているかどうかを確認し、ロケーションサービスを有効にしている場合はロケーションチェックを使用する許可を与えているかどうかを確認する必要があります。上のリンクに載せたファイルをチェックするだけで、そこにすべてがあることがわかります。 –

関連する問題