1

更新1:コードは実際には動作するが、場所を使用する許可は求められませんでした。アプリのアクセス権にアクセスし、手動で場所のアクセス権を付与すると機能します。私はそれが実行時に場所のアクセス許可を求めるようにする方法をまだ知りません。融合ロケーションプロバイダは一部の携帯電話でしか動作しません

私は融合位置プロバイダについて学び、ちょうど緯度と経度を表示するアプリを作った。私はLG G4 6.0を使用しており、この偉大なYouTube Tutorialに従っていますが、私はそれを携帯電話で実行すると、ちょうどgpsの座標ではなく、緯度と経度のテキストが表示されます。私はそれをMotorolla X 2015とMoto Droid Turboでテストしています。

コンパイルSDKのバージョン:7.0
Gradleのバージョン:2.14.1
Androidのプラグインのバージョン:2.2.0
ビルドツールのバージョン:24.0.2

マニフェスト:

<?xml version = "1.0" encoding = "utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.nathan.gpstest"> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

    <application 
      android:allowBackup="true" 
      android:icon="@mipmap/ic_launcher" 
      android:label="@string/app_name" 
      android:supportsRtl="true" 
      android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

受け台依存:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
    exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:24.2.1' 
    testCompile 'junit:junit:4.12' 
    //compile 'com.google.android.gms:play-services:9.6.1' 
    compile 'com.google.android.gms:play-services-location:9.6.1' 
} 

MainActivity:私のアプリは、私のデバイスのほとんどで実行する場所

package com.example.nathan.gpstest; 

import android.content.pm.PackageManager; 
import android.location.Location; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.FusedLocationProviderApi; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    TextView latitudeText; 
    TextView longitudeText; 
    private FusedLocationProviderApi locationProvider = LocationServices.FusedLocationApi; 
    private GoogleApiClient googleApiClient; 
    private LocationRequest locationRequest; 
    private double myLatitude; 
    private double mylongitude; 

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

    latitudeText = (TextView) findViewById(R.id.tvLatitude); 
    longitudeText = (TextView) findViewById(R.id.tvLongitude); 


    googleApiClient = new GoogleApiClient.Builder(this) 
     .addApi(LocationServices.API) 
     .addConnectionCallbacks(this) 
     .addOnConnectionFailedListener(this) 
     .build(); 

    locationRequest = new LocationRequest(); 
    locationRequest.setInterval(10 * 1000); 
    locationRequest.setFastestInterval(15 * 1000); 
    locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
    requestLocationUpdates(); 
    } 

    private void requestLocationUpdates() { 
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.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; 
    } 
    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
    latitudeText.setText("Connection Suspended"); 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    latitudeText.setText("Connection Failed"); 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
    myLatitude = location.getLatitude(); 
    mylongitude = location.getLongitude(); 

    latitudeText.setText("Latitude : " + String.valueOf(myLatitude)); 
    //latitudeText.setText("Latitude : " + String.valueOf(myLatitude)); 
    longitudeText.setText("Longitude : " + String.valueOf(mylongitude)); 
    } 

    @Override 
    protected void onStart() { 
    super.onStart(); 
    googleApiClient.connect(); 
    } 

    @Override 
    protected void onResume() { 
    super.onResume(); 
    if (googleApiClient.isConnected()) { 
     requestLocationUpdates(); 
    } 
    } 

    @Override 
    protected void onPause() { 
    super.onPause(); 
    LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this); 
    } 

    @Override 
    protected void onStop() { 
    super.onStop(); 
    googleApiClient.disconnect(); 
    } 
} 
+1

リンク[実行時のアクセス権の要求](https://developer.android.com/training/permissions/requesting.html)、[サンプル使用法](https://github.com/commonsguy/cw-omnibus/blob/master) /Location/FusedNew/app/src/main/java/com/commonsware/android/weather2/AbstractGoogleApiClientActivity.java) – Blackkara

答えて

0

これはあなたのコードがまだ処理していないことのAndroid Mの新しいランタイムの権限に関連するかもしれない、私はしばらく前にそのようなケースを持っていましたしかし、新しい電話機(Android 6.0以降を使用している)にインストールすると、クラッシュすることになります。

原因は、実行時にの明示的な許可要求の使用の欠如でした。

次のことを試みることができる:

 int currentapiVersion = android.os.Build.VERSION.SDK_INT; 

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

     Bundle tmpSavedInstanceState = savedInstanceState; 


     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

      Toast.makeText(this, "Please accept the permission so you can use the location services", Toast.LENGTH_LONG).show(); 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERM_REQUEST); 

     } else { 

      // No explanation needed, we can request the permission. 

      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERM_REQUEST); 

      // MY_PERM_REQUEST is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 



     if (permissionCheck == PackageManager.PERMISSION_GRANTED || currentapiVersion <= Build.VERSION_CODES.M) { 
      //Execute location service call if user has explicitly granted ACCESS_FINE_LOCATION.. 
      // use location services 
     } 

非同期アクセス権の要求は、このコールバックを呼び出して返されます:

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


        //do whatever you want with your location API 
        // everything went well, use the location services 


       } else { 

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

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 

あなたはまた、@Blackkara

レッツ言及documentationをチェックすることができます私はこれが助けられたかどうかを知っています)

+0

@Nathan O'Kaneあなたの問題を解決できましたか?これが助けられたかどうかを教えてください) – HenriqueMS

関連する問題