2016-05-30 68 views
11

我構建了一個開始抽樣GPS的應用程序。 正如您可能知道的那樣,在Android M及更高版本的運行時請求權限。等待用戶權限

所以,在我的情況下,我開始用,如果需要的權限檢查,就像這樣:

private void permissionForAndroidM() 
{ 
    if (Build.VERSION.SDK_INT > 22) { 
     String[] allPermissionNeeded = { 
       Manifest.permission.WRITE_EXTERNAL_STORAGE, 
       Manifest.permission.ACCESS_FINE_LOCATION, 
       Manifest.permission.ACCESS_COARSE_LOCATION, 
       Manifest.permission.CAMERA, 
       Manifest.permission.RECORD_AUDIO}; 

     List<String> permissionNeeded = new ArrayList<>(); 
     for (String permission : allPermissionNeeded) 
      if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) 
       permissionNeeded.add(permission); 
     if (permissionNeeded.size() > 0) { 
      requestPermissions(permissionNeeded.toArray(new String[0]), 0); 
     } 
    } 
} 

Android的繼續運行代碼並請求GPS數據(=崩潰,因爲用戶不接受許可請求)。

我發現很多關於等待用戶輸入的解決方案(例如使用DialogInterface.OnClickListener,link,但在這種情況下無法實現,因爲我沒有創建對話框)。

底線,問題:我如何等待Android權限對話框中的用戶答案?

+2

只是覆蓋onRequestPermissionsResult() –

+0

非常感謝你,我我以前不知道這個方法 – AsfK

回答

8

您可以處理用戶響應從活動覆蓋方法

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 

11

Android繼續運行代碼並詢問GPS數據(=崩潰,因爲用戶不接受權限請求)。

與Android中的很多事情一樣,requestPermissions()是異步的。該方法返回時甚至沒有提示用戶輸入權限。

如何等待Android權限對話框中的用戶答案?

你不知道。

如果您發現您已經獲得了許可,那麼您可以完成您的工作。如果您發現需要獲得許可,則需要延遲執行此項工作,直至獲得許可,請撥打onRequestPermissionsResult()

4

我的工作是以下方式:

1 - 創建一個Boolean輔助檢查權限授予:

public class UtilPermissions { 
    public static boolean hasPermissions(Context context, String... allPermissionNeeded) 
    { 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M 
       && context != null && allPermissionNeeded != null) 
      for (String permission : allPermissionNeeded) 
       if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) 
        return false; 
     return true; 
    } 
} 

2 - 創建一個Splash屏幕:

public class Splash extends Activity { 
    private static final int PERMISSION_ALL = 0; 
    private Handler h; 
    private Runnable r; 
    /* 
    SharedPreferences mPrefs; 
    final String settingScreenShownPref = "settingScreenShown"; 
    final String versionCheckedPref = "versionChecked"; 
    */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     h = new Handler(); 
     r = new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(Splash.this, "Runnable started", Toast.LENGTH_SHORT).show(); 

    /*   // (OPTIONAL) these lines to check if the `First run` ativity is required 
       int versionCode = BuildConfig.VERSION_CODE; 
       String versionName = BuildConfig.VERSION_NAME; 

       mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
       SharedPreferences.Editor editor = mPrefs.edit(); 

       Boolean settingScreenShown = mPrefs.getBoolean(settingScreenShownPref, false); 
       int savedVersionCode = mPrefs.getInt(versionCheckedPref, 1); 

       if (!settingScreenShown || savedVersionCode != versionCode) { 
        startActivity(new Intent(Splash.this, FirstRun.class)); 
        editor.putBoolean(settingScreenShownPref, true); 
        editor.putInt(versionCheckedPref, versionCode); 
        editor.commit(); 
       } 
       else 
    */ 
       startActivity(new Intent(Splash.this, MainActivity.class)); 
       finish();  
      } 
     }; 

     String[] PERMISSIONS = { 
       READ_PHONE_STATE, 
       MODIFY_AUDIO_SETTINGS, 
       ACCESS_FINE_LOCATION, 
       READ_SMS 
     }; 

     if(!UtilPermissions.hasPermissions(this, PERMISSIONS)){ 
      ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); 
     } 
     else 
      h.postDelayed(r, 1500); 
    } 

    // Put the below OnRequestPermissionsResult code here 
} 

3-創建OnRequestPermissionsResult如下:

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

    int index = 0; 
    Map<String, Integer> PermissionsMap = new HashMap<String, Integer>(); 
    for (String permission : permissions){ 
     PermissionsMap.put(permission, grantResults[index]); 
     index++; 
    } 

    if((PermissionsMap.get(ACCESS_FINE_LOCATION) != 0) 
      || PermissionsMap.get(READ_SMS) != 0){ 
     Toast.makeText(this, "Location and SMS permissions are a must", Toast.LENGTH_SHORT).show(); 
     finish(); 
    } 
    else 
    { 
     h.postDelayed(r, 1500); 
    } 
} 

4-限定的Splash屏幕LauncherAndroidManifest.xml爲:

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme.NoActionBar"> 
</activity> 

<activity 
    android:name=".Splash" 
    android:configChanges="orientation|keyboardHidden|screenSize" 
    android:theme="@style/SplashTheme"> 

    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

5-在styles.xml定義的SplashTheme爲:

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="android:windowBackground">@drawable/Splash</item> 
</style> 

-6-的@drawable/Splash.xmls是:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item 
     android:drawable="@color/lightgray"/> 

    <item> 
     <bitmap 
      android:gravity="center" 
      android:src="@mipmap/ic_launcher"/> 
    </item> 

</layer-list> 

7-在values/colors.xmlslightgray顏色已經被定義如下:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="lightgray">#D3D3D3</color> 
</resources>