Разрешение Android Marshmallow во время выполнения на заставке

#android #android-studio #android-permissions

#Android #android-studio #android-разрешения

Вопрос:

Я врезался в стену во время предоставления разрешения в marshmallow на заставке.Мой мотив заключается в том, что перед загрузкой заставки он должен запрашивать у пользователя разрешение.Но в моем случае он выдает запросы, но только на 2 секунды, а затем скрывается.

Это код

     public class SplashScreen extends AppCompatActivity {
    AlertDialog dailog;
    AlertDialog.Builder builder;

    ProgressBar progressBar;
    int progressStatus = 0;
    TextView textView1, textView2;
    Handler handler = new Handler();
    private SessionManager session;
    ConnectivityManager cm;
    boolean isConnected;
    private int STORAGE_PERMISSION_CODE = 23;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen);
        builder = new AlertDialog.Builder(SplashScreen.this);
        session = new SessionManager(getApplicationContext());
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }

        cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        isConnected = activeNetwork != null amp;amp;
                activeNetwork.isConnectedOrConnecting();

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            setupWindowAnimations();
        }


        if(isReadStorageAllowed()){
            //If permission is already having then showing the toast
            Toast.makeText(SplashScreen.this,"You already have the permission",Toast.LENGTH_LONG).show();
            //Existing the method with return
            return;
        }

        //If the app has not the permission then asking for the permission
        requestStoragePermission();

    }

    @Override
    protected void onStart() {
        super.onStart();

        if(isReadStorageAllowed()){
            //If permission is already having then showing the toast
            Toast.makeText(SplashScreen.this,"You already have the permission",Toast.LENGTH_LONG).show();
            //Existing the method with return
            return;
        }else    //If the app has not the permission then asking for the permission
                requestStoragePermission();
    }

    //First permission before activity creation then it would undergo onpause then onResume check net
    @Override
    protected void onResume() {
        super.onResume();
        netValidator();
    }

    public void netValidator(){
        if(isConnected) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    forNext();
                }
            }, 2000);
        }else{
            showDialog();
        }

    }
    private boolean isReadStorageAllowed() {
        //Getting the permission status
        int result = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
        //If permission is granted returning true
        if (result == PackageManager.PERMISSION_GRANTED)
            return true;

        //If permission is not granted returning false
        return false;
    }
    private void requestStoragePermission(){

        if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_PHONE_STATE)){
            //If the user has denied the permission previously your code will come to this block
            //Here you can explain why you need this permission
            //Explain here why you need this permission
            //Toast.makeText(SplashScreen.this, "For Marsmallow,we do need this permission", Toast.LENGTH_SHORT).show();
        }

        //And finally ask for the permission
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE},STORAGE_PERMISSION_CODE);
    }

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

        //Checking the request code of our request
        if(requestCode == STORAGE_PERMISSION_CODE){

            //If permission is granted
            if(grantResults.length >0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED){


                //Displaying a toast
                // Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();
            }else{
                // finish();
                //Displaying another toast if permission is not granted
                //Toast.makeText(this,"You have just denied the permission",Toast.LENGTH_LONG).show();
            }
        }
    }
    private void forNext(){

        if ((TextUtils.isEmpty(session.getUserName()))) {
            startActivity(new Intent(SplashScreen.this,splash_Login.class));
            finish();
        } else {
            Intent i = new Intent(SplashScreen.this, MainActivity.class);
            startActivity(i);
            finish();
        }
    }
    private void showDialog(){

        builder.setTitle("Warning !");
        builder.setCancelable(false);
        builder.setMessage("This application requires Internet connection.Go to Setting and Activate Internet");
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                finish();
                startActivity(new Intent(Settings.ACTION_SETTINGS));

            }

        });
        builder.setNegativeButton("EXIT", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                finish();
            }

        });

        dailog = builder.create();
        dailog.show();


    }

}
  

Я хотел бы получить подсказку перед загрузкой заставки.Не могли бы вы помочь мне, где внести изменения?

Комментарии:

1. Я рекомендую вам взглянуть на эту библиотеку. Это значительно упрощает задачу. PermissionsDispatcher

2. Мусафа, да, я это читал, но почему-то я хочу, чтобы это было решено в первую очередь.

3. Однако вы используете очень плохой дизайн. Много лазеек в вашем дизайне. И лучше было бы разрешить анимацию на заставке и проверить, не предоставлено ли разрешение, а затем запустить действие, предназначенное только для запроса разрешения, и при предоставлении разрешения двигаться вперед, в противном случае выйти.

4. Панкадж, я согласен с этим, новичок в этом, не могли бы вы указать мне в коде, где я должен его изменить?

Ответ №1:

Удалите свой метод netValidator(); из onResume и вызовите его здесь :

   if(grantResults.length >0 amp;amp; grantResults[0] == PackageManager.PERMISSION_GRANTED){

          netValidator();

        //Displaying a toast
        // Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();
    }
  

Также вызовите этот метод, где вы проверяете это :

  if(isReadStorageAllowed()){
      netValidator();
   }
  

В вашем onCreate() сделайте так :

   if(isReadStorageAllowed()){
    //If permission is already having then showing the toast
    Toast.makeText(SplashScreen.this,"You already have the    
     permission",Toast.LENGTH_LONG).show();

    netValidator();
  //Existing the method with return
    //return;    Remove this
}else{

     //If the app has not the permission then asking for the permission
     requestStoragePermission();
 }
  

Комментарии:

1. должен ли я удалить OnStart () , и как только я предоставил разрешение onSplash , при следующем открытии приложения оно застрянет на заставке!

2. Вам не нужно проверять OnStart ()

3. Спасибо, это помогло и еще кое-что, поскольку здесь я добавил только 1 разрешение, так как мне добавить больше одного? int result = ContextCompat.checkSelfPermission(это, Manifest.permission. READ_PHONE_STATE);

4. Сначала используйте checkSelfPermission, чтобы проверить разрешение, если оно недоступно, а затем запросить с помощью этого метода ActivityCompat.requestPermissions(this,new String[]{Manifest.permission . READ_PHONE_STATE,Manifest.permission. READ_SMS},STORAGE_PERMISSION_CODE); и проверьте onRequestPermissions(), используя массив grantResults