2017-09-06 2 views
1

위치가 앱의 핵심 기능이므로 사용자에게 위치 권한을 부여하기를 원합니다.사용자가 권한을 부여 할 때까지 사용자에게 허가를 요청하는 방법을 묻습니다.

허락을 위해 onResume을 확인했지만 좋은 결과를 얻지 못했지만 사용자가 앱 간을 전환 할 수 있으며 권한 대화 상자가 이미 표시 될 수 있습니다. 이 같은 내가 그 권한 대화 상자가 표시됩니다 알고 플래그를 사용하여 생각하고, 그래서 뭔가 :

public void onResume(...) 
{ 
    if(!isDialogDisplayed) 
    { 
    isDialogDisplayed = true; 
    // check for permission here 
    } 
} 

나는 대화를 해제 할 때 falseisDialogDisplayed를 설정해야합니다.

나는 이것을 할 수있는 가장 좋은 방법 인 다른 방법이 있는지 의심 스럽습니까?

private void checkForPermissions() { 
    if (ContextCompat.checkSelfPermission(this, 
      android.Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     ActivityCompat.requestPermissions(this, 
       new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
       MY_PERMISSIONS_REQUEST_FINE_LOCATION); 
    } else { 
     initializeViews(); 
    } 
} 

initializeViews() 앱이 정상처럼 시작하는 것입니다 : 당신의 MainActivity의 ONSTART 방법에

+0

나는 사용자가 당신에게 허가를주고 싶지 않은 시나리오를 다루는 적절한 방법이 아니라고 생각합니다. 사용자에게 요청하기 전에 권한이 필요한 이유를 사용자에게 알려주는 것이 좋습니다. 권한을 부여하지 않으면 롤백을 한 다음 기능을 사용하려고 시도하고 다시 사용하려고하면 다시 요청합니다. –

+0

@ GabrielVasconcelos 내 시나리오에서 앱이 계속 위치를 모니터링한다는 것을 제외하고 나는 당신과 동의한다. 위치 권한없이 앱이 작동하지 않습니다. 정말 사용자가 허가를 받아야합니다. –

+0

그런 다음 문제는 권한이 필요한지 여부가 아니라 사용자가 앱을 필요로하는지 여부와 그 앱이 무엇인지 알고 있는지 여부입니다. 즉, 앱을 종료하고 사용자가 언제 다시 방문하려고하는지 물어볼 수 있지만 어떤 일이 벌어지고 있는지 사용자에게 알려주는 것입니다. 다시 묻는 이유 또는 앱이 종료되는 이유 . –

답변

3

은이 방법을 실행합니다.

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    if (requestCode == MY_PERMISSIONS_REQUEST_FINE_LOCATION) { 
     if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      initializeFragments(); 
     } else { 
      openAlertDialog(); 
     } 
    } 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
} 

MY_PERMISSIONS_REQUEST_FINE_LOCATION만큼 당신은을 사용할 때, 내 경우 값은 중요하지 않습니다 100입니다 최종 INT 필드입니다 :

그런 다음 아래와 같이 onRequestPermissionsResult()를 구현 두 가지 방법 모두에서 동일한 변수.

private void openAlertDialog() { 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
    alertDialogBuilder.setMessage("This app requires your location to function!"); 
    alertDialogBuilder.setPositiveButton("Try again", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        checkForPermissions(); 
       } 
      }); 

    alertDialogBuilder.setNegativeButton("Settings", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
      i.addCategory(Intent.CATEGORY_DEFAULT); 
      i.setData(Uri.parse("package:dk.redweb.intern.findetlokum")); 
      startActivity(i); 
     } 
    }); 

    AlertDialog alertDialog = alertDialogBuilder.create(); 
    alertDialog.show(); 
} 

이 방법은 사용자가 주어집니다 대화 상자 창을 만드는 : 사용자가 권한을 허용하지 않은 경우

, openAlertDialog은() 다음 내 응용 프로그램에서가 호출됩니다 다시 권한 요청을 받거나 앱의 설정 메뉴를 열 수 있습니다. 사용자가 설정에서 앱으로 돌아 오면 onStart가 다시 호출되어 권한이 부여되었는지 확인합니다.

+0

사용자가 "기억"옵션을 선택하고 권한 대화 상자에서 거부를 누르면이 기능이 작동하지 않습니다. 표시를 위해 호출 할 때 권한 대화 상자가 다시 표시되지 않습니다. –

+0

사용자가 기억을 선택한 경우 정말 많이 할 수 없습니다. 아마도 Dialog Button을 변경하여 설정 메뉴로 바꿀 수 있습니다. –

+0

예, 사용자를 설정 메뉴로 안내하십시오. 하지만 그가 앱으로 돌아 가면 다시 확인해야합니다. 그래서 여기서'onResume'이 작동합니다 ... –

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

       // permission was granted, yay! 

      } else { 

       // permission denied, boo! 
       //Show dialog again 
      } 
      return; 
     } 
    } 
} 
+0

사용자가 "기억"옵션을 선택하고 권한 대화 상자에서 거부를 누르는 경우에는 작동하지 않습니다. 표시를 위해 호출 할 때 권한 대화 상자가 다시 표시되지 않습니다. –

관련 문제