2016-03-28 4 views
0

Ich benutze Android Studio 1.5.1. Ich habe ein Kartenfragment in meiner Aktivität und ich versuche, die setMyLocationEnabled-Methode im Aktivitätscode zu verwenden, um den aktuellen Standort des Benutzers auf der Karte anzuzeigen. Ich habe alle erforderlichen Berechtigungscodes eingefügt, die in der Aktivitätsdatei erforderlich sind, wenn das Telefon des Benutzers Android 6.0 Marshmallow ist. Doch ich bin immer der folgende Fehler mit einer roten Wellenlinie unter „setMyLocationEnabled“ noch bevor ich das Projekt erstellen:Android Google Maps setMyLocationEnabled Methode Fehler im Zusammenhang mit Gradle-Datei

call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException` 

Ich kann immer noch das Projekt erstellen und führen Sie es auf dem Gerät Android 5.0.1 laufen, aber Die App stürzt mit der Fehlermeldung ab, dass Google Play Services nicht mehr funktioniert.

Die compileSdkVersion-Variable wird in der build.gradle-Datei auf 23 festgelegt, aber wenn ich die compileSdkVersion in eine niedrigere wie 15 ändere, verursacht es alle Arten von Fehlern, wenn ich versuche, das Projekt zu erstellen. Wenn ich targetsdkVersion jedoch von 23 auf 18 ändere, bekomme ich diese unscharfe Linie nicht, und die App läuft ohne Absturz auf dem Gerät.

Ich bin verwirrt, ich verstehe, dass ich den zusätzlichen Berechtigungscode in der Aktivitätsdatei einschließen muss, nur für den Fall, dass das Telefon des Benutzers Marshmallow läuft, aber wie Sie sehen können, geht es nicht so gut. Ich möchte sdkversion 23 anvisieren, so dass ich Funktionen von Android 6.0 nutzen kann, während ich Nutzer mit einer niedrigeren Android-Version auf ihren Handys unterstütze. Jede Hilfe würde sehr geschätzt werden.

Danke.

MapsActivity.java

package dev.com.transitone; 

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.support.design.widget.NavigationView; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

import java.io.IOException; 
import java.util.logging.Logger; 

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback, NavigationView.OnNavigationItemSelectedListener { 

    private GoogleMap mMap; 
    private static final int LOCATION_REQUEST_CODE = 101; 
    private String TAG = "MapDemo"; 


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

     requestPermission(Manifest.permission.ACCESS_FINE_LOCATION, 
       LOCATION_REQUEST_CODE); 


     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 



     // Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 


    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    protected void requestPermission(String permissionType, int 
      requestCode) { 
     int permission = ContextCompat.checkSelfPermission(this, 
       permissionType); 
     if (permission != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, 
        new String[]{permissionType}, requestCode 
      ); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] 
                grantResults) { 
     switch (requestCode) { 
      case LOCATION_REQUEST_CODE: { 
       if (grantResults.length == 0 
         || grantResults[0] != PackageManager.PERMISSION_GRANTED) 
       { 
        Toast.makeText(this, "Unable to show location - permission required", Toast.LENGTH_LONG).show(); 
       } 
       return; 
      } 
     } 
    } 
    /** 
    * Manipulates the map once available. 
    * This callback is triggered when the map is ready to be used. 
    * This is where we can add markers or lines, add listeners or move the camera. In this case, 
    * we just add a marker near Sydney, Australia. 
    * If Google Play services is not installed on the device, the user will be prompted to install 
    * it inside the SupportMapFragment. This method will only be triggered once the user has 
    * installed Google Play services and returned to the app. 
    */ 
    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     if (mMap != null) { 
      mMap.setMyLocationEnabled(true); 
     } 

     // Add a marker in Sydney and move the camera 
     /*LatLng sydney = new LatLng(-34, 151); 
     mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
     mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));*/ 
    } 


    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.nav_camera) { 
      // Handle the camera action 
     } else if (id == R.id.nav_gallery) { 

     } else if (id == R.id.nav_slideshow) { 

     } else if (id == R.id.nav_manage) { 

     } else if (id == R.id.nav_share) { 

     } else if (id == R.id.nav_send) { 

     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 


} 

Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="dev.com.transitone"> 

    <!-- 
     The ACCESS_COARSE/FINE_LOCATION permissions are not required to use 
     Google Maps Android API v2, but you must specify either coarse or fine 
     location permissions for the 'MyLocation' functionality. 
    --> 
    <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">--> 

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

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

     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar" 
      > 

     </activity> 
     <!-- 
      The API key for Google Maps-based APIs is defined as a string resource. 
      (See the file "res/values/google_maps_api.xml"). 
      Note that the API key is linked to the encryption key used to sign the APK. 
      You need a different API key for each encryption key, including the release key that is used to 
      sign the APK for publishing. 
      You can define the keys for the debug and release targets in src/debug/ and src/release/. 
     --> 
     <meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="@string/google_maps_key" /> 


    </application> 

</manifest> 

build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId "dev.com.transitone" 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.2.1' 
    compile 'com.android.support:design:23.2.1' 
    compile 'com.google.android.gms:play-services:8.4.0' 
} 
+0

tun Sie die neuesten Play-Dienste auf Ihrem Gerät –

+0

@MounirElfassi installiert Ja, das tue ich. – Plex752

Antwort

1

accordi ng docs Sie Ihre Anfrage Erlaubnis Methode innerhalb dieser if-Anweisung aufrufen müssen:

diese
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 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; 
    } 
+0

Das funktioniert, aber anscheinend müssen Sie checkselfpermission innerhalb der Methode aufrufen, die den Aufruf setMyLocationEnabled enthält, was in meinem Fall die onMapReady-Methode ist. Vielen Dank. – Plex752

0

Versuchen:

if (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

        googleMap.getUiSettings().setMyLocationButtonEnabled(true); 
       }