2017-08-12 45 views
1

我正在申请中,我想检查棉花糖和以上的权限。我在Splash屏幕中使用了许可代码。现在我想要的是,当我启动应用程序时,第一个启动画面出现5秒钟,然后重定向到家庭活动并检查权限。现在我面临的问题是只有在屏幕连续显示和没有任何事情发生。我怎么解决这个问题 ?在清单如何解决marshamallow或更高版本中的权限检查问题?

权限文件 -

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="com.secure.cod.permission.MAPS_RECEIVE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 

活动 -

public class SplashActivity extends AppCompatActivity { 
    // Splash screen timer 
    private static int SPLASH_TIME_OUT = 5000; 

    private static final int PERMISSION_CALLBACK_CONSTANT = 100; 
    private static final int REQUEST_PERMISSION_SETTING = 101; 
    String[] permissionsRequired = new String[]{Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION, 
      Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_COARSE_LOCATION, 
    Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE}; 
    private SharedPreferences permissionStatus; 
    private boolean sentToSettings = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 
     getSupportActionBar().hide(); 

     permissionStatus = getSharedPreferences("permissionStatus",MODE_PRIVATE); 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     if(requestCode == PERMISSION_CALLBACK_CONSTANT){ 
      //check if all permissions are granted 
      boolean allgranted = false; 
      for(int i=0;i<grantResults.length;i++){ 
       if(grantResults[i]==PackageManager.PERMISSION_GRANTED){ 
        allgranted = true; 
       } else { 
        allgranted = false; 
        break; 
       } 
      } 

      if(allgranted){ 
       proceedAfterPermission(); 
      } else if(ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[0]) 
        || ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[1]) 
        || ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[2]) 
        || ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[3]) 
        || ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[4]) 
        || ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[5]) 
        || ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[6]) 
        || ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[7])){ 
       AlertDialog.Builder builder = new AlertDialog.Builder(SplashActivity.this); 
       builder.setTitle("Need Multiple Permissions"); 
       builder.setMessage("This app needs Camera and Location permissions."); 
       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
         ActivityCompat.requestPermissions(SplashActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT); 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 
       builder.show(); 
      } else { 
       Toast.makeText(getBaseContext(),"Unable to get Permission",Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == REQUEST_PERMISSION_SETTING) { 
      if (ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[0]) == PackageManager.PERMISSION_GRANTED) { 
       //Got Permission 
       proceedAfterPermission(); 
      }else { 
       getPermission(); 
      } 
     } 
    } 

    private void proceedAfterPermission() { 

     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       // This method will be executed once the timer is over 
       // Start your app main activity 
       Intent i = new Intent(SplashActivity.this, HomeActivity.class); 
       startActivity(i); 

       // close this activity 
       finish(); 
      } 
     }, SPLASH_TIME_OUT); 

     Toast.makeText(getBaseContext(), "We got All Permissions", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    protected void onPostResume() { 
     super.onPostResume(); 
     if (sentToSettings) { 
      if (ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[0]) == PackageManager.PERMISSION_GRANTED) { 
       //Got Permission 
       proceedAfterPermission(); 
      }else { 
       getPermission(); 
      } 
     } 
    } 

    public void getPermission(){ 
     if(ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[0]) != PackageManager.PERMISSION_GRANTED 
       || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[1]) != PackageManager.PERMISSION_GRANTED 
       || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[2]) != PackageManager.PERMISSION_GRANTED 
       || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[3]) != PackageManager.PERMISSION_GRANTED 
       || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[4]) != PackageManager.PERMISSION_GRANTED 
       || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[5]) != PackageManager.PERMISSION_GRANTED 
       || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[6]) != PackageManager.PERMISSION_GRANTED 
       || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[7]) != PackageManager.PERMISSION_GRANTED){ 
      if(ActivityCompat.shouldShowRequestPermissionRationale(SplashActivity.this,permissionsRequired[0]) 
        || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[1]) != PackageManager.PERMISSION_GRANTED 
        || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[2]) != PackageManager.PERMISSION_GRANTED 
        || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[3]) != PackageManager.PERMISSION_GRANTED 
        || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[4]) != PackageManager.PERMISSION_GRANTED 
        || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[5]) != PackageManager.PERMISSION_GRANTED 
        || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[6]) != PackageManager.PERMISSION_GRANTED 
        || ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[7]) != PackageManager.PERMISSION_GRANTED){ 
       //Show Information about why you need the permission 
       AlertDialog.Builder builder = new AlertDialog.Builder(SplashActivity.this); 
       builder.setTitle("Need Multiple Permissions"); 
       builder.setMessage("This app needs Camera and Location permissions."); 
       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
         ActivityCompat.requestPermissions(SplashActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT); 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 
       builder.show(); 
      } else if (permissionStatus.getBoolean(permissionsRequired[0],false)) { 
       //Previously Permission Request was cancelled with 'Dont Ask Again', 
       // Redirect to Settings after showing Information about why you need the permission 
       AlertDialog.Builder builder = new AlertDialog.Builder(SplashActivity.this); 
       builder.setTitle("Need Multiple Permissions"); 
       builder.setMessage("This app needs Camera and Location permissions."); 
       builder.setPositiveButton("Grant", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
         sentToSettings = true; 
         Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
         Uri uri = Uri.fromParts("package", getPackageName(), null); 
         intent.setData(uri); 
         startActivityForResult(intent, REQUEST_PERMISSION_SETTING); 
         Toast.makeText(getBaseContext(), "Go to Permissions to Grant Camera and Location", Toast.LENGTH_LONG).show(); 
        } 
       }); 
       builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 
       builder.show(); 
      } else { 
       //just request the permission 
       ActivityCompat.requestPermissions(SplashActivity.this,permissionsRequired,PERMISSION_CALLBACK_CONSTANT); 
      } 


      SharedPreferences.Editor editor = permissionStatus.edit(); 
      editor.putBoolean(permissionsRequired[0],true); 
      editor.commit(); 
     } else { 
      //You already have the permission, just go ahead. 
      proceedAfterPermission(); 
     } 
    } 

} 

回答

1

代码的权限检查从来没有运行。我看到你可能想要在onPostResume方法中启动它,但sentToSettings变量被初始化为false,因此权限检查从不运行。

@Override 
protected void onPostResume() { 
    super.onPostResume(); 
    if (sentToSettings) { 
     if (ActivityCompat.checkSelfPermission(SplashActivity.this, permissionsRequired[0]) == PackageManager.PERMISSION_GRANTED) { 
      //Got Permission 
      proceedAfterPermission(); 
     }else { 
      getPermission(); 
     } 
    } 
} 
+0

谢谢你解决了我的问题。 –

0

试试看。

SplashActivity

public class SplashActivity extends AppCompatActivity { 

    private PrefM pref; 

    @Override 
    protected void onCreate(Bundle args) { 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     super.onCreate(args); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     pref = new PrefM(this); 

     setContentView(R.layout.activity_splash); 

     init(); 


    } 

    private void init() { 
     if (!pref.isFirstTimeLaunch()) { 
      Intent intent = new Intent(SplashActivity.this, HomeActivity.class); 
      SplashActivity.this.startActivity(intent); 
      SplashActivity.this.finish(); 
     } else { 
      metho(); 

     } 
    } 

    private void metho() { 
     pref.setFirstTimeLaunch(false); 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       SplashActivity.this.finish(); 
       Intent intent = new Intent(SplashActivity.this, HomeActivity.class); 
       SplashActivity.this.startActivity(intent); 
      } 
     }, 3000); // 3sec 


    } 

    public static class PrefM { 

     private SharedPreferences pref; 
     private SharedPreferences.Editor editor; 
     private Context _context; 
     private int MODE = 0; 

     public PrefM(Context context) { 
      this._context = context; 
      pref = _context.getSharedPreferences("First_Time", MODE); 
      editor = pref.edit(); 
     } 

     public void setFirstTimeLaunch(boolean isFirstTime) { 
      editor.putBoolean("first_time", isFirstTime); 
      editor.commit(); 
     } 

     public boolean isFirstTimeLaunch() { 
      return pref.getBoolean("first_time", true); 
     } 

    } 

HomeActivity

public class HomeActivity extends AppCompatActivity { 

    private Toolbar toolbar; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     perm(); 

     setContentView(R.layout.home_activity); 

     init(); 


    } 

    private void init() { 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 


    } 

    //onBackPressed method 
    public void onBackPressed() { 
     Log.d(TAG, "onBackPressed: "); 
     HomeActivity.this.finish(); 

    } 


    //Permission method. 
    private void perm() { 

     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
      int hasStoragePermission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE); 
      int hasStorage = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
      int hasAccessPermission = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION); 
      int hasInternetPermission = checkSelfPermission(Manifest.permission.INTERNET); 
      int hasNetworkPermission = checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE); 
      int hasWifiPermission = checkSelfPermission(Manifest.permission.ACCESS_WIFI_STATE); 


      List<String> permissions = new ArrayList<>(); 

      if (hasWifiPermission != PackageManager.PERMISSION_GRANTED) { 
       permissions.add(Manifest.permission.ACCESS_WIFI_STATE); 
      } 

      if (hasNetworkPermission != PackageManager.PERMISSION_GRANTED) { 
       permissions.add(Manifest.permission.ACCESS_NETWORK_STATE); 
      } 

      if (hasInternetPermission != PackageManager.PERMISSION_GRANTED) { 
       permissions.add(Manifest.permission.INTERNET); 
      } 


      if (hasStoragePermission != PackageManager.PERMISSION_GRANTED) { 
       permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE); 
      } 

      if (hasStorage != PackageManager.PERMISSION_GRANTED) { 
       permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
      } 
      if (hasAccessPermission != PackageManager.PERMISSION_GRANTED) { 
       permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); 
      } 

      if (!permissions.isEmpty()) { 
       requestPermissions(permissions.toArray(new String[permissions.size()]), PERMISSION); 
      } 
     } 


    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case PERMISSION: 
       for (int i = 0; i < permissions.length; i++) { 
        if (grantResults[i] == PackageManager.PERMISSION_DENIED) 
         Toast.makeText(this, "Permission denied: " + permissions[i] + ". This may cause " + 
           "the app to behave abnormally", Toast.LENGTH_SHORT).show(); 
       } 
       break; 
      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
相关问题