#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