2017-03-05 106 views
4

首先,我知道這是一個重複的問題,但我一直在回答其他類似問題的答案,並且未能找到任何解決方案的成功。在運行時詢問權限Android M +

我開發了一個應用程序,它完美地運行在我的測試設備上,這是一個運行Android L(5.0.1)的三星S4,但是我希望這個應用程序也能在更新版本的Android上工作。

我知道Android M +的請求權限已更改,因此必須在運行時詢問它們,但是當我嘗試實現此操作時,對話框從不出現,因此從不要求所需的權限。

我要求的許可是ACCESS_FINE_LOCATION

這裏是我的清單文件中的相關代碼:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

哪裏許可問,如果它不被授予:

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

    startGeofenceMonitoring(); 

} else { 
    askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION); 
} 

askForPermission功能(略從谷歌的例子修改):

private void askForPermission(String permission, Integer requestCode) { 
    if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) { 

      //This is called if user has denied the permission before 
      //In this case I am just asking the permission again 
      ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode); 

     } else { 

      Log.d(TAG, "askForPermission: " + permission); 

      ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode); 
     } 
    } else { 
     Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show(); 
    } 
} 

而onRequestPermissionsResult函數:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    Log.d(TAG, "onRequestPermissionsResult: " + requestCode); 

     switch (requestCode) { 
      case 1: 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        Log.d(TAG, "onRequestPermissionsResult: request"); 

        Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show(); 

        startGeofenceMonitoring(); 
       } 
       break; 
     } 
} 

正如我所說的,這是要求的權限對話框中永遠不會出現,但我的控制檯告訴我,ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);被調用,並且大量的研究後,我仍然不知道爲什麼它不是」不工作。我認爲唯一可能的原因是此活動是一項顯示Google地圖地圖的片段活動。我確實嘗試在另一個活動中請求權限,但發生完全相同的情況。

謝謝。

編輯

所以我只是測試我這裏張貼在一個完全新的項目代碼和它運行得很好,顯示該對話框。我現在很困惑,因爲什麼阻止了我的當前項目中顯示這個對話框。

+1

請嘗試完全卸載您的應用程序,然後重新安裝它。也許在測試中,當被問及時,你會被拒絕兩次,之後Android會停止顯示對話。 – CommonsWare

+0

剛試過這個,很不幸,它還沒有解決問題。 – Haris

回答

1
final private int REQUEST_CODE_ASK_PERMISSIONS = 123; 

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

private void requestPermission() { 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat 
       .requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ASK_PERMISSIONS: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // Permission Granted 
       Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT) 
         .show(); 
      } else { 
       // Permission Denied 
       Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT) 
         .show(); 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 
+0

這仍然給我完全相同的問題。沒有對話框。 – Haris

+0

請檢查您的設備是否支持運行時權限。 (嘗試用另一個新設備) –

+0

謝謝,但我能夠解決它。我在這裏發佈我的解決方案 – Haris

0

我設法解決它!

在我的應用程序中,我使用了不同的活動來控制選項卡以及向用戶顯示哪些活動。這是第一個要展示的活動,我認爲這是整個活動中顯示的唯一活動,但僅顯示其他活動的內容。所以當我請求MapsActivity的權限時,它沒有顯示,因爲MapsActivity不是實際存在的人。

我的解釋可能是錯了,所以這裏是我的TabBarActivity代碼:

TabHost tabHost = getTabHost(); 
    TabHost.TabSpec spec; 
    Intent intent; 

    intent = new Intent().setClass(this, SecondActivity.class); 
    spec = tabHost.newTabSpec("Second").setIndicator("Profile") 
      .setContent(intent); 
    tabHost.addTab(spec); 

    intent = new Intent().setClass(this, MapsActivity.class); 
    spec = tabHost.newTabSpec("First").setIndicator("Location") 
      .setContent(intent); 
    tabHost.addTab(spec); 

    intent = new Intent().setClass(this, ThirdActivity.class); 
    spec = tabHost.newTabSpec("Third").setIndicator("Settings") 
      .setContent(intent); 
    tabHost.addTab(spec); 
0

下面的代碼爲我工作。

public static final int MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE=1; 

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
    View view=inflater.inflate(R.layout.activity_tracks,container,false); 

    getPermission(); 
     ... 
      } 

public void getPermission(){ 
     if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ 
      if(ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)){ 

      }else{ 
       ActivityCompat.requestPermissions(getActivity(),new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE); 
      } 
     }else{ 
      getSongDetails(); 
     } 
    } 


@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode){ 
     case -1: 
      //hello 
      break; 
     case MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE: 
      if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){ 
       getPermission(); 
      }else{ 
       Toast.makeText(getActivity(),"You've denied permission",Toast.LENGTH_LONG).show(); 
      } 
      return; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 

}