Как получить разные результаты для разных множественных комбинаций разрешений «принять/отклонить»

У меня есть приложение с регистрационной активностью. Когда пользователь регистрируется, у него запрашиваются эти два разрешения:

  • READ_PHONE_STATE
  • READ_CONTACTS

Пользователь должен иметь возможность принять или отклонить оба варианта или принять один и отклонить другой. В зависимости от этого я бы хотел получить 4 разных результата:

  1. Если пользователь разрешает READ_PHONE_STATE и отклоняет READ_CONTACTS, результат должен быть:register(name, email, password, getMyPhoneNumber(), false);
  2. Если пользователь отклоняет READ_PHONE_STATE и разрешает READ_CONTACTS, результат должен быть: register(name, email, password, "", true);
  3. Если пользователь отклоняет оба, результат должен быть: register(name, email, password, "", false);
  4. Если пользователь разрешает оба варианта, результат должен быть: register(name, email, password, getMyPhoneNumber(), true);

Я уже некоторое время пытаюсь найти решение, которое позволило бы использовать эти комбинации, пытаясь это, это, это, это, это и многое другое, но я не смог найти работающее решение.

Это моя исходная RegisterActivity:

public class RegisterActivity extends AppCompatActivity {
private static final String TAG = "RegisterActivity";
EditText nameText, emailText, passwordText;
Button registerButton;
TextView loginLink;
CheckBox checkBoxShowPassword;
private SessionManager session;
private SQLiteHandler db;
private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 0;
RegisterActivity registerActivity = RegisterActivity.this;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    nameText = findViewById(R.id.input_name);
    emailText = findViewById(R.id.input_email);
    passwordText = findViewById(R.id.input_password);
    registerButton = findViewById(R.id.btn_register);
    loginLink = findViewById(R.id.link_login);

    session = new SessionManager(getApplicationContext());
    db = new SQLiteHandler(getApplicationContext());
    if (session.isLoggedIn()) {
        Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
        startActivity(intent);
        finish();
    }

    registerButton.setOnClickListener(v -> {
        String name = nameText.getText().toString().trim();
        String email = emailText.getText().toString().trim();
        String password = passwordText.getText().toString().trim();
        String phone = "";

        if (ContextCompat.checkSelfPermission(registerActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(registerActivity, Manifest.permission.READ_CONTACTS)) {
                if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
                    register(name, email, password, phone, false);
                } else {
                    Toast.makeText(getApplicationContext(), R.string.please_enter_credentials, Toast.LENGTH_LONG).show();
                }
            } else {
                ActivityCompat.requestPermissions(registerActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
            }
        } else {
            if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
                register(name, email, password, phone, true);
            } else {
                Toast.makeText(getApplicationContext(), R.string.please_enter_credentials, Toast.LENGTH_LONG).show();
            }
        }
    });
    loginLink.setOnClickListener(v -> {
        finish();
    });

    checkBoxShowPassword = findViewById(R.id.checkBoxShowPassword);
    checkBoxShowPassword.setOnCheckedChangeListener((buttonView, isChecked) -> {
        if (!isChecked) {               passwordText.setTransformationMethod(PasswordTransformationMethod.getInstance());
        } else {                passwordText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        }
    });
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    String email = emailText.getText().toString().trim();
    String password = passwordText.getText().toString().trim();
    String name = nameText.getText().toString().trim();
    String phone = "";

    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
                    register(name, email, password, phone, true);
                } else {
                    Toast.makeText(getApplicationContext(), R.string.please_enter_credentials, Toast.LENGTH_LONG).show();
                }
            } else {
                if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
                    register(name, email, password, phone, false);
                } else {
                    Toast.makeText(getApplicationContext(), R.string.please_enter_credentials, Toast.LENGTH_LONG).show();
                }
            }
        }
    }
}

public void register(final String name, final String email, final String password, final String phone, Boolean isGranted) {
    Log.d(TAG, "Login");
    if (!validate()) {
        onRegisterFailed();
        return;
    }

    registerButton.setEnabled(true);
    String tag_string_req = "req_login";
    final ProgressDialog progressDialog = new ProgressDialog(RegisterActivity.this,
            R.style.AppTheme_Dark_Dialog);
    progressDialog.setIndeterminate(true);
    progressDialog.setMessage(getString(R.string.authenticating));
    progressDialog.show();

    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);
    progressDialog.dismiss();

    Call<ContactResponse> call = apiService.register(name, email, password, phone);
    call.enqueue(new Callback<ContactResponse>() {
        @Override
        public void onResponse(Call<ContactResponse> call, retrofit2.Response<ContactResponse> response) {
            if (response.body().getError()) {
                String message = response.body().getErrorMessage();
                onRegisterFailed(message);
                return;
            }

            final Contact contact = response.body().getResults();
            if (contact != null) {
                session.setLogin(true);

                db.addUser(contact.getUserName(), contact.getEmail(), contact.getUserId(), contact.getCreatedAt(), contact.getAbout(),
                        contact.getThumbnailUrl(), contact.getPhone());

                Intent intent = new Intent(RegisterActivity.this,
                        MainActivity.class);
                startActivity(intent);
                finish();
                onRegisterSuccess();

                if (isGranted) {
                    updateContacts();
                }
            } else {
                onRegisterFailed();
            }
        }
        @Override
        public void onFailure(Call<ContactResponse> call, Throwable t) {
            // Log error here since request failed
            Log.e(TAG, t.toString());
            onRegisterFailed();
        }
    });
}
public void userExists(final String phone) {
}
public void onRegisterSuccess() {
    registerButton.setEnabled(true);
    setResult(RESULT_OK, null);
    finish();
}
public void onRegisterFailed() {
    Toast.makeText(getBaseContext(), R.string.registration_failed, Toast.LENGTH_LONG).show();
    registerButton.setEnabled(true);
}
public void onRegisterFailed(String message) {
    Toast.makeText(getBaseContext(), message, Toast.LENGTH_LONG).show();
    registerButton.setEnabled(true);
}
public boolean validate() {
    boolean valid = true;

    String name = nameText.getText().toString();
    String email = emailText.getText().toString();
    String password = passwordText.getText().toString();

    if (name.isEmpty() || name.length() < 3) {
        nameText.setError(getString(R.string.enter_3_chars));
        valid = false;
    } else {
        nameText.setError(null);
    }
    if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
        emailText.setError(getString(R.string.enter_valid_email));
        valid = false;
    } else {
        emailText.setError(null);
    }
    if (password.isEmpty() || password.length() < 4 || password.length() > 20) {
        passwordText.setError(getString(R.string.enter_4_20_char));
        valid = false;
    } else {
        passwordText.setError(null);
    }

    return valid;
}
private String getMyPhoneNumber() {
    TelephonyManager tMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

    String simCountry = null;
    if (tMgr != null) {
        simCountry = tMgr.getSimCountryIso().toUpperCase();
    }
    if (tMgr != null) {
        String simOperatorCode = tMgr.getSimOperator();
    }
    if (tMgr != null) {
        String simOperatorName = tMgr.getSimOperatorName();
    }
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    }
    String simSerial = tMgr.getSimSerialNumber();
    String MyPhoneNumber = "0000000000";
    try {
        MyPhoneNumber = tMgr.getLine1Number();
    } catch (NullPointerException ex) {
    }
    if (MyPhoneNumber == null || MyPhoneNumber.equals("")) {
        return "";
    }
    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
    Phonenumber.PhoneNumber countryNumberProto = null;
    try {
        countryNumberProto = phoneUtil.parse(MyPhoneNumber, simCountry);
    } catch (NumberParseException e) {
        System.err.println(getString(R.string.numberparseexception_thrown) + e.toString());
    }
    return phoneUtil.format(countryNumberProto, PhoneNumberUtil.PhoneNumberFormat.E164);
}
public void updateContacts() {

    String[] PROJECTION = new String[]{
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER
    };

    Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, null);

    HashMap<String, String> user = db.getUserDetails();
    String userId = user.get("uid");

    if (phones != null) {
        while (phones.moveToNext()) {
            if (phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) != -1) {
                final String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                ApiInterface apiService =
                        ApiClient.getClient().create(ApiInterface.class);
                Call<ContactsResponse> call = apiService.contactExists(phoneNumber, userId);
                call.enqueue(new Callback<ContactsResponse>() {
                    @Override
                    public void onResponse(Call<ContactsResponse> call, retrofit2.Response<ContactsResponse> response) {
                        Log.e(TAG, "abc");
                    }
                    @Override
                    public void onFailure(Call<ContactsResponse> call, Throwable t) {
                        Log.e(TAG, t.toString());
                    }
                });
            }
        }
    }
     if (phones != null) {
         phones.close();
     }
   }
}

Это одно из решений, которые я пробовал (редактировал действие регистрации выше) на основе этот пример, но это не сработало, если я не принял оба, а если бы я отклонил одно или оба из них, я не смог бы зарегистрироваться. Моя отредактированная RegisterActivity теперь выглядит так:

registerButton.setOnClickListener(v -> {

        RequestMultiplePermission();
    });

    loginLink.setOnClickListener(v -> {
        finish();
    });

    checkBoxShowPassword = findViewById(R.id.checkBoxShowPassword);
    checkBoxShowPassword.setOnCheckedChangeListener((buttonView, isChecked) -> {
        if (!isChecked) {
            passwordText.setTransformationMethod(PasswordTransformationMethod.getInstance());
        } else {
            passwordText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        }
    });
}
private void RequestMultiplePermission() {

    ActivityCompat.requestPermissions(registerActivity, new String[]
            {
                    Manifest.permission.READ_PHONE_STATE,
                    Manifest.permission.READ_CONTACTS
            }, RequestPermissionCode);

}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case RequestPermissionCode:
            String name = nameText.getText().toString().trim();
            String email = emailText.getText().toString().trim();
            String password = passwordText.getText().toString().trim();
            String phone = getMyPhoneNumber();

            if (grantResults.length > 0) {
                boolean PhoneStatePermission = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean ContactsPermission = grantResults[1] == PackageManager.PERMISSION_GRANTED;

                if (PhoneStatePermission && ContactsPermission) {
                    register(name, email, password, phone, true);
                } else if (!PhoneStatePermission && ContactsPermission) {
                    register(name, email, password, "", true);
                } else if (!ContactsPermission && PhoneStatePermission) {
                    register(name, email, password, phone, false);
                } else {
                    register(name, email, password, "", false);
                }
            }
            break;
    }
}

public boolean CheckingPermissionIsEnabledOrNot() {
    int FirstPermissionResult = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE);
    int SecondPermissionResult = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_CONTACTS);
    return FirstPermissionResult == PackageManager.PERMISSION_GRANTED &&
            SecondPermissionResult == PackageManager.PERMISSION_GRANTED;
}

private String getMyPhoneNumber() {
    TelephonyManager tMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

    String simCountry = null;
    if (tMgr != null) {
        simCountry = tMgr.getSimCountryIso().toUpperCase();
    }
    if (tMgr != null) {
        String simOperatorCode = tMgr.getSimOperator();
    }
    if (tMgr != null) {
        String simOperatorName = tMgr.getSimOperatorName();
    }
    RequestMultiplePermission();
...

Каким будет лучший способ вернуть результат комбинированных разрешенных и отклоненных разрешений.


comment
Я не смог зарегистрироваться Не могли бы вы уточнить, что это значит? Вы пробовали записывать, что происходит в onRequestPermissionsResult? Кстати, нет необходимости делать ContactsPermission частью if-выражения; вы можете просто передать его как 4-й аргумент в register.   -  person Michael    schedule 05.01.2018
comment
@Michael Я не публиковал журнал, я добавлю его, когда вернусь домой :), и что касается оператора if, это первый вариант, я изменил его на одну строку после того, как он был опубликован :)   -  person Banana    schedule 05.01.2018


Ответы (1)


Я нашел решение:

// define global variable for contacts permission
private static Boolean contactsGranted = false;
...
registerButton.setOnClickListener(v -> {
        String name = nameText.getText().toString().trim();
        String email = emailText.getText().toString().trim();
        String password = passwordText.getText().toString().trim();
});
...
 private void CheckContacts(String name, String email, String password) {
    if (ContextCompat.checkSelfPermission(registerActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(registerActivity, Manifest.permission.READ_CONTACTS)) {
            if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
                // contacts permission is not granted, check phone permission
                contactsGranted = false;
                CheckPhone(name, email, password);
            } else {
                Toast.makeText(getApplicationContext(), R.string.please_enter_credentials, Toast.LENGTH_LONG).show();
            }
        } else {
            ActivityCompat.requestPermissions(registerActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
        }
    } else {
        if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
            // contacts permission is granted, check phone permission
            contactsGranted = true;
            CheckPhone(name, email, password);
        } else {
            Toast.makeText(getApplicationContext(), R.string.please_enter_credentials, Toast.LENGTH_LONG).show();
        }
    }
}

private void CheckPhone(String name, String email, String password) {
    if (ContextCompat.checkSelfPermission(registerActivity, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(registerActivity, Manifest.permission.READ_PHONE_STATE)) {
            // phone permission is not granted, call register and pass empty phone string
            register(name, email, password, "");
        } else {
            ActivityCompat.requestPermissions(registerActivity, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE);
        }
    } else {
        // phone permission is granted, call register and pass empty getMyPhoneNumber
        register(name, email, password, getMyPhoneNumber());
    }
}
...
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {

    String email = emailText.getText().toString().trim();
    String password = passwordText.getText().toString().trim();
    String name = nameText.getText().toString().trim();

    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted, yay! Do the
                // contacts-related task you need to do.
                if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
                    // contacts permission is granted, check phone permission
                    contactsGranted = true;
                    CheckPhone(name, email, password);
                } else {
                    // Prompt user to enter credentials
                    Toast.makeText(getApplicationContext(), R.string.please_enter_credentials, Toast.LENGTH_LONG).show();
                // permission denied, boo! Disable the
                // functionality that depends on this
                if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {
                    // contacts permission is not granted, check phone permission
                    contactsGranted = false;
                    CheckPhone(name, email, password);
                } else {
                    // Prompt user to enter credentials
                    Toast.makeText(getApplicationContext(), R.string.please_enter_credentials, Toast.LENGTH_LONG).show();
                }
            }
            break;
        case MY_PERMISSIONS_REQUEST_READ_PHONE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // phone permission is granted, call register and pass empty getMyPhoneNumber
                register(name, email, password, getMyPhoneNumber());
            } else {
                // phone permission is not granted, call register and pass empty phone string
                register(name, email, password, "");
            }
            break;
    }
}
...
// Register
public void register(final String name, final String email, final String password, final String phone) {
...
if (contactsGranted) {
   updateContacts();
}

Надеюсь, это поможет кому-то еще.

person Banana    schedule 07.01.2018