等待用户许可

我建立了一个在启动时采样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 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数据(=崩溃,因为用户没有接受权限请求)。

我find了许多关于等待用户输入的解决方案(比如使用DialogInterface.OnClickListener , 链接 ,但是在这种情况下无法实现,因为我没有创建对话框)。

最重要的是,问题:如何从Android权限对话框中等待用户回答?

您可以处理用户响应覆盖方法

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

来自你的活动。

Android继续运行代码并要求GPS数据(=崩溃,因为用户没有接受权限请求)。

与Android中的许多内容一样, requestPermissions()是异步的。 在此方法返回时,甚至没有提示用户输入权限。

如何从Android权限对话框中等待用户回答?

你没有。

如果您发现自己已获得许可,则可以开展工作。 如果您发现必须请求权限,则在onRequestPermissionsResult()获得权限之前,您将延迟执行该工作。

我按照以下方式工作:

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 PermissionsMap = new HashMap(); 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-在AndroidManifest.xml中将Splash屏幕定义为Launcher

         

5-在styles.xml中将SplashTheme定义为:

  

6- @drawable/Splash.xmls是:

 < ?xml version="1.0" encoding="utf-8"?>       

7-在values/colors.xmlslightgray颜色定义如下:

 < ?xml version="1.0" encoding="utf-8"?>  #D3D3D3