2016-11-23 2 views
11

Я хочу проверить разрешение внутри фрагмента.Как проверить разрешение во фрагменте

мой код:

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


      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), 
        android.Manifest.permission.ACCESS_FINE_LOCATION)) { 

       // Show an explanation 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(getActivity(), 
         new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
         1); 



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

но onRequestPermissionsResult не вызывается после того, как разрешить или запретить.

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 1: { 
      Log.e("test","0"); 
      // 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. 
       //yes 

       Log.e("test","1"); 

       Intent intent = new Intent(getActivity(), MapsActivity.class); 
       intent.putExtra("latitude", 35.694828); 
       intent.putExtra("longitude", 51.378129); 
       startActivity(intent); 

      } else { 
       utilityFunctions.showSweetAlertWarning(getActivity(),r.getString(R.string.str_warning_title_empty), 
         r.getString(R.string.str_you_must_allow_this_permission_toast), 
         r.getString(R.string.str_warning_btn_login)); 

       Log.e("test","2"); 
      } 
      return; 
     } 

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

Возможного дубликат [разрешений во время выполнения запроса от v4.Fragment и иметь обратный вызов пойти Фрагмент?] (HTTP://stackoverflow.com/questions/32890702/request-runtime-permissions-from-v4-fragment-and-have-callback-go-to-fragment) –

ответ

14

Я сделал следующее, чтобы проверить разрешение внутри фрагмента.

if (ActivityCompat.checkSelfPermission(getContext(), 
      android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
      ActivityCompat.checkSelfPermission(getContext(), 
        android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(getActivity(), 
       new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, 
         android.Manifest.permission.ACCESS_FINE_LOCATION}, 
       REQUEST_LOCATION); 
    } else { 
     Log.e("DB", "PERMISSION GRANTED"); 
    } 
+0

Нам все еще нужно запрашивать разрешение, если пользователь этого не предоставил. –

1

Если вы закрыли свое разрешение приложения из настроек, вы не можете открыть свое разрешение с кодом или версией вашего Android ниже, чем Marshmallow.

Вы можете проверить эту документацию https://developer.android.com/training/permissions/requesting.html И это пример https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html

-2

Смотрите этот Link это дает вам полное руководство для обработки разрешения во время выполнения. даже с получением логического значения, чтобы проверить, разрешено ли разрешение или нет, как вы этого хотите.

+0

Ссылка рассказывает о запросе разрешения на деятельность –

3

onRequestPermissionsResult вызывается в деятельности не фрагмент. Вместо этого попробуйте переопределить onRequestPermissionsResult.

9

Фрагмент имеет requestPermissions() и onRequestPermissionsResult() методы, его использовать.

Но checkSelfPermission() от ActivityCompat (не требуется Activity, только Context).

if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
    requestPermissions(//Method of Fragment 
     new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
     REQUEST_PERMISSIONS_CODE_WRITE_STORAGE 
    ); 
} else { 
    downloadImage(); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    if (requestCode == REQUEST_PERMISSIONS_CODE_WRITE_STORAGE) { 
     if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      proceedWithSdCard(); 
     } 
    } 
} 
+0

Фрагмент запросаУсловия требуют Android M, но он доступен в FragmentCompat. –

27

Так я и сделал, это работает для меня. Благодаря!

Для деятельности:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE); 

Для фрагмента:

requestPermissions(permissionsList, REQUEST_CODE); 
+0

Запрос на фрагмент Требуется Android M, но он доступен в FragmentCompat для более старых версий API. –

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