2016-11-07 3 views
0

у меня есть телефон с Android 6.0, а метод onMapReady не выполнить, потому что я думаю, что нужны права во время выполнения, и я не знаю, как это сделать, это мой кодспросить разрешения во время выполнения для onMapsReady андроид

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

    GoogleMap map; 
    GoogleApiClient mGoogleApiClient; 
    String email; 

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

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     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.addDrawerListener(toggle); 
     toggle.syncState(); 
     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

     FirebaseUser user= FirebaseAuth.getInstance().getCurrentUser(); 
     //obtener datos para la barra 
     if(user != null) { 

      String nombre=user.getDisplayName(); 
      email=user.getEmail(); 
      Uri foto=user.getPhotoUrl(); 

      NavigationView navigationsView = (NavigationView) findViewById(R.id.nav_view); 
      View hView = navigationsView.getHeaderView(0); 
      TextView nav_user = (TextView)hView.findViewById(R.id.txtMail); 
      TextView name=(TextView) hView.findViewById(R.id.txtNombre); 
      ImageView img_user = (ImageView)hView.findViewById(R.id.profile_image); 

      name.setText(nombre); 
      nav_user.setText(email); 
      Picasso.with(this).load(foto).into(img_user); 
     } 
     else { 
      SharedPreferences loginbdd=getSharedPreferences("login", Context.MODE_PRIVATE); 
      email=loginbdd.getString("nombre",""); 
      String nombre=loginbdd.getString("mail",""); 

      NavigationView navigationsView = (NavigationView) findViewById(R.id.nav_view); 
      View hView = navigationsView.getHeaderView(0); 
      TextView nav_user = (TextView)hView.findViewById(R.id.txtMail); 
      TextView name=(TextView) hView.findViewById(R.id.txtNombre); 
      ImageView img_user = (ImageView)hView.findViewById(R.id.profile_image); 

      nav_user.setText(email); 
      name.setText(nombre); 
     } 

    } 

    private void goLogin() { 
     Intent intent = new Intent(this, Login.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      new AlertDialog.Builder(MainActivity.this) 
        .setIcon(R.drawable.cerrar).setTitle("Cerrar Aplicación").setMessage("Deseas cerrar CicloMapp?") 
        .setCancelable(true).setPositiveButton("Si", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          System.exit(0); 
         } 

        }) 
        .setNegativeButton("No", null).show(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } else if (id == R.id.endSession) { 
      new AlertDialog.Builder(MainActivity.this) 
        .setIcon(R.drawable.cerrar) 
        .setTitle("Cerrar sessión") 
        .setMessage("Deseas cerrar sesión?") 
        .setCancelable(true) 
        .setPositiveButton("Si", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser(); 
          if(user!= null){ 
           LoginManager.getInstance().logOut(); 
           FirebaseAuth.getInstance().signOut(); 
           goLogin(); 
          }else{ 
           SharedPreferences loginbdd=getSharedPreferences("login", Context.MODE_PRIVATE); 
           SharedPreferences.Editor editor=loginbdd.edit(); 
           editor.remove("inicio"); 
           editor.commit(); 
           goLogin(); 
          } 
         } 

        }) 
        .setNegativeButton("No", null).show(); 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 

     int id = item.getItemId(); 

     if (id == R.id.AgregarRuta) { 

     } else if (id == R.id.ValorarRuta) { 
      Intent i = new Intent(MainActivity.this, Valoraraciones.class); 
      i.putExtra("correo", email); 
      startActivity(i); 
     } else if (id == R.id.ReportarRuta) { 
      Intent i = new Intent(MainActivity.this, Reportar.class); 
      i.putExtra("correos", email); 
      startActivity(i); 
     } else if (id == R.id.Eventos) { 

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

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

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

    @Override 
    public void onMapReady(final GoogleMap googleMap) { 
     map=googleMap; 
     map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     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) { 
      return; 
     } 
     map.getUiSettings().setMapToolbarEnabled(false); 
     map.getUiSettings().setMyLocationButtonEnabled(true); 
     map.setMyLocationEnabled(true); 
     map.getUiSettings().setZoomControlsEnabled(true); 
     CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(-33.447487,-70.673676)); 
     CameraUpdate zoom = CameraUpdateFactory.zoomTo(11); 
     map.moveCamera(center); 
     map.animateCamera(zoom); 
     Polyline po = new Polyline(); 
     po.AddPolyline(map); 

     int height = 50; 
     int width = 50; 
     BitmapDrawable bitmapdraw = (BitmapDrawable) getResources().getDrawable(R.drawable.mruta); 
     Bitmap b = bitmapdraw.getBitmap(); 

     Bitmap smallMarker = Bitmap.createScaledBitmap(b, width, height, false); 
     final Marcadores ma=new Marcadores(); 
     ma.MarcadoreBdd(map,smallMarker); 

    } 

} 

возможно onmylocation нужны разрешения Ithink

пса: отлично работает с Android 4.4, проблема с Android 6.0 или выше

+0

* Возможно, onmylocation требует разрешения ithink * к счастью, это легко точно определить, потому что он вам говорит. –

+0

Вы можете мне помочь? Я не знаю, как реализовать разрешения во время выполнения. – zhet

+0

Может быть, google знает –

ответ

0

Я также боролся с правами доступа во время выполнения при обновлении моего приложения к новой Android версии.

Но я нашел этот пост очень полезно:

https://inducesmile.com/android/android-6-marshmallow-runtime-permissions-request-example/ (ниже код приходит от этого).

В принципе, вам нужно проверить, есть ли у вас разрешения в своем приложении, когда они вам понадобятся (возможно, во время запуска в вашем случае) с таким кодом;

if (ContextCompat.checkSelfPermission(WebActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(WebActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_REQUEST_CODE); 
} 

Затем вам нужно обрабатывать ответа в onRequestPermissionsResult метод

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == MY_REQUEST_CODE) { 
     if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      //You have permission, so continue 
     }else if (grantResults[0] == PackageManager.PERMISSION_DENIED){ 
      if (ActivityCompat.shouldShowRequestPermissionRationale(WebActivity.this, Manifest.permission.RECORD_AUDIO)) { 
       //Show an explanation to the user *asynchronously* 
       ActivityCompat.requestPermissions(WebActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_REQUEST_CODE); 
      }else{ 
       //Never ask again and handle your app without permission. 
      } 
     } 
    } 
} 

Не забывайте, что вы по-прежнему нужны разрешения, которые будут указаны в вашем файле манифеста.

+0

первые две строки вашего кода, должен быть в режиме onstart? я не понимаю – zhet

+0

Вам нужно позвонить в то место, где ваше приложение нуждается в этих разрешениях. Это может быть где угодно в вашем APP. Но в вашем случае вы, вероятно, нуждаетесь в этом в методе onCreate. Посмотрите на пример в ссылке. –

Смежные вопросы