Парольная авария при создании пользователя

Я использую Parse в качестве моего бэкенда для своего приложения для Android. У меня есть отчет о сбоях только для некоторых устройств Android, когда я пытаюсь создать объект User. Ошибка при сбое:

Caused by: java.lang.IllegalArgumentException: 
You must register this ParseObject subclass before instantiating it.
at com.parse.ParseObject.<init>(ParseObject.java:184)

Устройства, которые отправили отчет о сбое:

HTC Desire 510 (htc_a11ul)  2   33.3% Android 4.4
Xperia E3 (D2203)   1   16.7%  Android 4.4
Galaxy S4 (jflte)   1   16.7%  Android 4.4
Galaxy S5 (klte)    1   16.7%  Android 4.4

Это очень странно, поскольку в настоящее время я тестировал свой код на Samsung Note 4, Galaxy S4, S5 и Nexus 5 без каких-либо проблем. Я не уверен, почему Parse просит меня подкласс из ниоткуда, поскольку я не пытаюсь использовать функциональные возможности подкласса, предлагаемые Parse. Опять же, я тестировал этот код на других устройствах без каких-либо проблем.

Может кто-нибудь, пожалуйста, скажите мне, как это исправить? Я включил код ниже, где я создаю пользователя, и он сработает.

Спасибо!

    Parse.initialize(this, "XXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXX");
    ParseUser user = new ParseUser();
    user.setUsername(email);
    user.setPassword(confirmPassword);
    user.setEmail(email);
    user.put("deviceID", deviceID);
    user.put("name", fullName);

    progress = new ProgressDialog(Register.this);
    progress.setMessage("Creating Account... Please Wait");
    progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progress.setIndeterminate(true);
    progress.setCanceledOnTouchOutside(false);
    progress.setCancelable(false);
    progress.show();


    user.signUpInBackground(new SignUpCallback() {
        public void done(ParseException e) {
            if (e == null) {
                // Hooray! Let them use the app now.
                Intent i = new Intent(Register.this, DeviceSettingsIntro.class);
                startActivity(i);
                progress.hide();
                btnRegister.setEnabled(true);
            } else {
                // Sign up didn't succeed. Look at the ParseException
                // to figure out what went wrong
                progress.hide();
                checkParseError(e);
                btnRegister.setEnabled(true);
            }
        }
    });

Ответ 1

Вы пытались инициализировать Parse с помощью класса Application, как описано в Parse кратком руководстве по началу работы? Возможно, Parse не был успешно инициализирован

Создайте класс, расширяющий приложение, и для содержимого:

@Override
public void onCreate() {
    super.onCreate();

    Parse.enableLocalDatastore(this); //might not be needed
    Parse.initialize(this, "xxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxx");
}

Отредактируйте свой манифест <application> , добавьте это:

    android:name="com.yourpackage.applicationclass"

//so it should look like (for example) : 
<application
    android:name="com.yourpackage.yourapplicationclass"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    //put activities here

</application>

Таким образом, Parse всегда будет инициализироваться, когда ваше приложение запускается независимо от Activity.

Ответ 2

Вы можете попробовать зарегистрировать класс ParseUser перед вызовом Parse.initialize(), например:

ParseObject.registerSubclass(ParseUser.class);
Parse.initialize();

Я знаю, что вам не нужно это делать, но может быть проблемой для вашей проблемы. Вы можете проверить и опубликовать результаты!

В противном случае вы всегда можете найти дополнительную информацию в команде анализа.

Ответ 3

Вы добавили эти две команды в свой манифест?:

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Ответ 4

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

try {
user.signUp();
Intent i = new Intent(Register.this, DeviceSettingsIntro.class);
startActivity(i);
progress.hide();
btnRegister.setEnabled(true);
} catch (ParseException e1) {
progress.hide();
checkParseError(e1);
btnRegister.setEnabled(true);
}