2016-03-18 14 views
10

Tôi muốn đặt bản đồ của mình tập trung vào vị trí hiện tại của tôi khi mở MapActivity. Tôi có một vấn đề với một dòng cụ thể:Cách giải quyết yêu cầu cấp quyền setMyLocationEnabled?

mMap.setMyLocationEnabled(true); 

Gọi đòi hỏi sự cho phép có thể bị từ chối bởi người sử dụng: Mã một cách rõ ràng nên kiểm tra xem nếu phép là availabe với ('checkPermission') hoặc xử lý một cách rõ ràng với tiềm năng 'Ngoại lệ an ninh'.

Làm cách nào để giải quyết vấn đề này? Tôi đã đọc một số điều khi tôi tìm kiếm sự cố này và tôi không thể tìm thấy điều gì hữu ích.

Đây là mã đầy đủ:

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 
private static final String FIREBASE_URL="https://haerev.firebaseio.com/"; 
private Firebase firebaseRef; 
private GoogleMap mMap; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps2); 
    Firebase.setAndroidContext(this); 
    firebaseRef = new Firebase(FIREBASE_URL); 


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

} 

private void setUpMapIfNeeded() { 
    // Do a null check to confirm that we have not already instantiated the map. 
    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
       .getMap(); 
     mMap.setMyLocationEnabled(true); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) { 


      mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { 

       @Override 
       public void onMyLocationChange(Location arg0) { 
        // TODO Auto-generated method stub 

        mMap.addMarker(new MarkerOptions().position(new LatLng(arg0.getLatitude(), arg0.getLongitude())).title("It's Me!")); 
       } 
      }); 

     } 
    } 
} 

Sau khi đọc một số ý kiến, và đọc vấn đề này: http://developer.android.com/training/permissions/requesting.html

tôi thêm những dòng này:

private void setUpMapIfNeeded() { 
    // Do a null check to confirm that we have not already instantiated the map. 
    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
       .getMap(); 

     if (ContextCompat.checkSelfPermission(MapsActivity.this, 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 


      if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, 
        Manifest.permission.ACCESS_FINE_LOCATION)) { 

       checkSelfPermission("You have to accept to enjoy the most hings in this app"); 
      } else { 


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

      } 
     } 

     mMap.setMyLocationEnabled(true); 
     // Check if we were successful in obtaining the map. 
     if (mMap != null) { 


      mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { 

       @Override 
       public void onMyLocationChange(Location arg0) { 
        // TODO Auto-generated method stub 

        mMap.addMarker(new MarkerOptions().position(new LatLng(arg0.getLatitude(), arg0.getLongitude())).title("It's Me!")); 
       } 
      }); 

     } 
    } 
} 

Nhưng bây giờ tôi có một mới vấn đề. Nó không nhận ra dòng

"MY_PERMISSION_REQUEST_ACCESS_FINE_LOCATION".

Tôi đoán tôi đang sử dụng nó theo cách sai. Tôi nên sử dụng nó như thế nào?

+0

vấn đề với dòng đó là gì? – tyczj

+0

@tyczj xin lỗi tôi quên dòng đó. Tôi đã thêm lỗi ở trên. –

+1

bạn nên xem xét cách xử lý các quyền thời gian chạy http://developer.android.com/training/permissions/requesting.html – tyczj

Trả lời

9

Sau khi nghiên cứu đồ sộ trên trang web, đây là những gì đang làm việc cho tôi :

private void setUpMapIfNeeded() { 
    if (mMap == null) { 
     // Try to obtain the map from the SupportMapFragment. 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
       .getMap(); 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      mMap.setMyLocationEnabled(true); 
     } else { 
      Toast.makeText(MapsActivity.this, "You have to accept to enjoy all app's services!", Toast.LENGTH_LONG).show(); 
      if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
        == PackageManager.PERMISSION_GRANTED) { 
       mMap.setMyLocationEnabled(true); 
      } 
     } 

     if (mMap != null) { 


      mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() { 

       @Override 
       public void onMyLocationChange(Location arg0) { 
        // TODO Auto-generated method stub 

        CameraUpdate center= CameraUpdateFactory.newLatLng(new LatLng(arg0.getLatitude(), arg0.getLongitude())); 
        CameraUpdate zoom=CameraUpdateFactory.zoomTo(12); 

        mMap.moveCamera(center); 
        mMap.animateCamera(zoom); 
       } 
      }); 

     } 
    } 
} 
+0

Vui lòng thêm một số nhận xét –

+0

NHƯNG KHI BẠN ĐANG HÃY ĐƯA RA TỪ NGƯỜI DÙNG VÀ KIỂM TRA NẾU HOẠT ĐỘNG ĐƯỢC CẤP HOẶC HOÀN HẢO BỞI NGƯỜI DÙNG – user2779311

0

thử này
Hoặc thiết lập

targetSdkVersion 22 

Hoặc xin phép runtime tham khảo ở đây: - http://coderzpassion.com/android-new-runtime-permissions/ Hy vọng nó giúp nhờ

+0

Nó không hoạt động. Xin hãy giúp tôi, nó thực sự stucks dự án của tôi. –

+0

@GiladNeiger Điều gì sẽ xảy ra khi bạn đặt targetdkversion là 22? –

+0

Tôi không biết làm thế nào nhưng bây giờ nó hoạt động ... Cảm ơn! Nhưng bây giờ tôi muốn làm điều đó khi bản đồ tạo ra, nó sẽ tập trung vào vị trí của tôi. Làm thế nào tôi có thể làm cho nó xảy ra? –

3

Rõ ràng hơn Thực hiện:

@Override 
public void onMapReady(GoogleMap googleMap) { 
    MapsInitializer.initialize(getContext()); 
    mGoogleMap = googleMap; 
    if(checkPermission()) 
    mGoogleMap.setMyLocationEnabled(true); 
    else askPermission(); 
} 



// Check for permission to access Location 
    private boolean checkPermission() { 
     Log.d(TAG, "checkPermission()"); 
     // Ask for permission if it wasn't granted yet 
     return (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED); 
    } 
    // Asks for permission 
    private void askPermission() { 
     Log.d(TAG, "askPermission()"); 
     ActivityCompat.requestPermissions(
       getActivity(), 
       new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, 
       REQ_PERMISSION 
     ); 
    } 

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     Log.d(TAG, "onRequestPermissionsResult()"); 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case REQ_PERMISSION: { 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
        // Permission granted 
        if(checkPermission()) 
        mGoogleMap.setMyLocationEnabled(true); 

       } else { 
        // Permission denied 

      } 
      break; 
     } 
    } 
} 
Các vấn đề liên quan