2016-03-28 16 views
0

私はAndroid Studio 1.5.1を使用しています。私は自分のアクティビティにマップフラグメントを持っており、マップ上にユーザの現在の位置を表示するためにアクティビティコードでsetMyLocationEnabledメソッドを使用しようとしています。ユーザーの電話がAndroid 6.0のMarshmallowの場合に必要な、活動ファイルに必要なすべての必要な権限コードが含まれています。しかし、私はプロジェクトをビルドする前であっても「setMyLocationEnabled」の下に波線赤い線で次のエラー取得しています:Android GoogleマップsetMyLocationEnabledメソッドのエラーがグラデルファイルに関連する

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` 

私はまだプロジェクトをビルドとAndroid 5.0.1を実行しているデバイス上でそれを実行することができますが、しかし、アプリがクラッシュし、「申し訳ありませんGoogle Playサービスが機能しなくなりました」というエラーメッセージが表示されます。

compileSdkVersion変数はbuild.gradleファイルで23に設定されていますが、compileSdkVersionを15のように低く変更すると、プロジェクトのビルド時にあらゆる種類のエラーが発生します。しかし、私がtargetsdkVersionを23から23のように変更した場合、私はその不規則な線を得ず、アプリケーションはクラッシュすることなくデバイス上で正常に動作します。

私は混乱しています。ユーザーの携帯電話がmarshmallowを実行している場合に備えて、余分な権限コードをアクティビティファイルに含める必要があることを理解していますが、私はsdkversion 23をターゲットにしてAndroid 6.0の機能を使用できるようにし、携帯電話でAndroidバージョンの低いユーザーをサポートしたいと考えています。どんな助けでも大歓迎です。

ありがとうございました。

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

あなたのデバイス –

+0

@MounirElfassiにインストールされている最新のプレイ・サービスを持っていますはい、私がやります。 – Plex752

答えて

1

accordi文の場合は、この中にあなたの要求の許可メソッドを呼び出す必要がありますDOCSするngの:

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

それは動作しますが、明らかに、私の場合はonMapReadyメソッドであるsetMyLocationEnabled呼び出しを含むメソッド内でcheckselfpermissionを呼び出す必要があります。ありがとう。 – Plex752

0

はこれを試してみてください:

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

        googleMap.getUiSettings().setMyLocationButtonEnabled(true); 
       } 
関連する問題