1

更新1:我發現代碼確實可以工作,但它並未要求獲得使用您的位置的權限。如果你去應用程序的權限,並手動給它的位置訪問它的作品。我仍然不知道如何讓它在運行時請求位置權限。熔合位置提供商僅在某些電話上工作

我正在學習融合位置提供程序,並創建了一個應用程序來顯示經緯度。我用的是我的LG G4 6.0,並遵循這個偉大的YouTube Tutorial,但是當我在手機上運行它時,它只顯示經緯度和長文本不是GPS座標。我在Motorolla X 2015和Moto Droid Turbo上進行了測試,效果很好。

編譯SDK版本:7.0
搖籃版本: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> 

Gradle的依賴關係:

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

相關問題