2016-02-02 20 views
10

Android Developer Documentation cho ví dụ này của yêu cầu quyền trong thời gian chạy:runtime Android permissions- làm thế nào để thực hiện

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.READ_CONTACTS) 
    != PackageManager.PERMISSION_GRANTED) { 

    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
      Manifest.permission.READ_CONTACTS)) { 

     // 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. 

    } else { 

     // No explanation needed, we can request the permission. 

     ActivityCompat.requestPermissions(thisActivity, 
       new String[]{Manifest.permission.READ_CONTACTS}, 
       MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

     // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 

"MY_PERMISSIONS_REQUEST_READ_CONTACTS" trong ví dụ này là gì? Nó nói đó là một hằng số int được định nghĩa bởi ứng dụng, nhưng điều đó có nghĩa là tôi nên tạo một Constants.java và khai báo một static static int? nên giá trị là gì?

Trong các ví dụ khác, tôi thấy mọi người sử dụng 1 ở đây hoặc 0 hoặc 0xFFEEDDCC, nhưng tôi không thể tìm thấy giải thích về nó là gì. Ai đó có thể giải thích cho tôi những gì cần phải đi ở đây và tại sao? (Trong trường hợp của tôi, tôi cần đảm bảo ứng dụng có quyền truy cập vị trí tốt)

Tài liệu ActivityCompat cho biết "Mã yêu cầu cụ thể của ứng dụng khớp với kết quả được báo cáo cho onRequestPermissionsResult"? Điều này không giúp tôi.

+0

có thể trùng lặp của [Android quyền - Manifest hoặc android.manifest] (http://stackoverflow.com/questions/34901870/android-permissions-manifest-or-android-manifest) – JpCrow

+0

Bạn có thể kiểm tra một lớp mà tôi đã tạo và sử dụng nó trong Fragments github.com/mptrista/PermissionHelper Nó dành cho các phân đoạn và trong trường hợp yêu cầu một quyền duy nhất. – toshkinl

Trả lời

13

"MY_PERMISSIONS_REQUEST_READ_CONTACTS" trong ví dụ này là gì?

Đây là số int, để thực hiện cuộc gọi requestPermissions() cụ thể với số gọi onRequestPermissionsResult() tương ứng.

Dưới bìa, requestPermissions() sử dụng startActivityForResult(); int này có vai trò tương tự như trong startActivityForResult().

điều đó có nghĩa là tôi nên tạo một Constants.java và khai báo một static static int?

Tôi chỉ cần đặt số này là private static final int trong hoạt động. Nhưng, bạn có thể khai báo nó bất cứ nơi nào bạn muốn.

Giá trị phải là bao nhiêu?

Tôi dường như nhớ lại rằng nó cần phải dưới 0x8000000, nhưng nếu không nó có thể là bất cứ điều gì bạn muốn. Giá trị mà bạn sử dụng cho mỗi cuộc gọi requestPermissions() trong một hoạt động sẽ nhận được int riêng biệt, nhưng số thực không quan trọng.

Nếu hoạt động của bạn chỉ có một cuộc gọi requestPermissions(), thì giá trị int thực sự không quan trọng. Nhưng nhiều ứng dụng sẽ có một số cuộc gọi requestPermissions() trong một hoạt động. Trong trường hợp đó, nhà phát triển có thể cần biết, trong số onRequestPermissionsResult(), yêu cầu này là kết quả cho.

2

Nhìn thêm một chút nữa trong tài liệu trong "Xử lý câu trả lời yêu cầu quyền" và bạn sẽ thấy mục đích của nó.

Một phương pháp gọi lại gọi onRequestPermissionsResult được gửi trở lại cùng mã như một tham số để bạn biết được sự cho phép đã được yêu cầu/cấp:

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

Kể từ khi liên tục được sử dụng bởi bạn chỉ có bạn mới có thể cung cấp cho nó bất kỳ giá trị bạn thích là public static final int. Mỗi quyền được yêu cầu cần có hằng số riêng.

0
public class SplashActivity extends RuntimePermissionsActivity { 


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

    SplashActivity.super.requestAppPermissions(new 
        String[]{android.Manifest.permission.READ_PHONE_STATE, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE, 
        Manifest.permission.READ_EXTERNAL_STORAGE}, R.string.app_name 
      , 20); 

} 

@Override 
public void onPermissionsGranted(int requestCode) { 


    try { 
     TelephonyManager tele = (TelephonyManager) getApplicationContext() 
       .getSystemService(Context.TELEPHONY_SERVICE); 

     String imei =tele.getDeviceId() 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public abstract class RuntimePermissionsActivity extends AppCompatActivity { 
private SparseIntArray mErrorString; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mErrorString = new SparseIntArray(); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    int permissionCheck = PackageManager.PERMISSION_GRANTED; 
    for (int permission : grantResults) { 
     permissionCheck = permissionCheck + permission; 
    } 
    if ((grantResults.length > 0) && permissionCheck == PackageManager.PERMISSION_GRANTED) { 
     onPermissionsGranted(requestCode); 
    } else { 

     finish(); 

    } 
} 

public void requestAppPermissions(final String[] requestedPermissions, 
            final int stringId, final int requestCode) { 
    mErrorString.put(requestCode, stringId); 
    int permissionCheck = PackageManager.PERMISSION_GRANTED; 
    boolean shouldShowRequestPermissionRationale = false; 
    for (String permission : requestedPermissions) { 
     permissionCheck = permissionCheck + ContextCompat.checkSelfPermission(this, permission); 
     shouldShowRequestPermissionRationale = shouldShowRequestPermissionRationale || ActivityCompat.shouldShowRequestPermissionRationale(this, permission); 
    } 
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 
     if (shouldShowRequestPermissionRationale) { 
      ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode); 
      /*Snackbar.make(findViewById(android.R.id.content), stringId, 
        Snackbar.LENGTH_INDEFINITE).setAction("GRANT", 
        new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          ActivityCompat.requestPermissions(RuntimePermissionsActivity.this, requestedPermissions, requestCode); 
         } 
        }).show();*/ 
     } else { 
      ActivityCompat.requestPermissions(this, requestedPermissions, requestCode); 
     } 
    } else { 
     onPermissionsGranted(requestCode); 
    } 
} 

public abstract void onPermissionsGranted(int requestCode); 

}

Các vấn đề liên quan