2016-12-21 5 views
0

Я пытаюсь разработать приложение для отправки электронных писем, на самом деле я только начал изучать Java.Получить строку из SharedPreferences в AsyncTask

Я создал строки «email_address» и «pass» в своих общих ссылках, чтобы пользователь мог их изменить. Тогда я пытаюсь отправить электронную почту, используя эти данные ->

//Creating a new session 
    session = Session.getDefaultInstance(props, 
      new javax.mail.Authenticator() { 
       //Authenticating the password 
       protected PasswordAuthentication getPasswordAuthentication() { 

        return new PasswordAuthentication(sharedPrefs.getString("email_address", "a"), sharedPrefs.getString("pass", "a")); } 
      }); 

    try { <...> 

А потом я получил это:

Вызванный: java.lang.NullPointerException: Попытка вызвать метод интерфейса «java.lang.String android.content.SharedPreferences.getString (java.lang.String, java.lang.String)»на нулевой ссылки на объект

Android Studio указывает мне на этой линии ->

return new PasswordAuthentication(sharedPrefs.getString("email_address", "a"), sharedPrefs.getString("pass", "a")); }  

Если я hardc ode my gmail и password в этой строке, он отлично работает, но мне нужно изменить их (в случае, если пользователь не может создать это приложение из моего исходного кода). Пожалуйста, помогите, я уже 3 часа просматривал этот сайт и androiddevelopers тоже. :(

+0

Вы инициализировали 'sharedPrefs', получив его из' context'? – AndiGeeky

+0

Поскольку вы изучаете Java, вы должны знать, что такое пустой указатель и как его решить: http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i- fix-it – adalPaRi

+0

И как @AndiGeeky говорит, ваша переменная 'sharedPrefs' не инициализируется. Это проблема. – adalPaRi

ответ

0

Настоятельно не рекомендуется хранить пароли любого типа в вашем sharedPreferences, если вы создаете приложение, в котором вы хотите, чтобы пользователь выбирал, куда они хотят отправить его, например, из своего личного использования Gmail Intents, но вместо этого, если вы решили отправить электронную почту автоматически, я бы рекомендовал создание Gmail SMTP адрес электронной почты, чтобы отправить его из и передать имя пользователя и пароль к Authenticator через него. (Java почты API)

E-mail Intent Пример : Send Email Intent

, но если вы хотите отправить письмо по электронной почте автоматически: Example of sending email using Java Mail API

0

Aswering от Вашего комментария в вопросе:

Прежде всего, это не делает ничего, из-за переменной LOCAL внутри метода:

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    //get sharedPreferences here 
    SharedPreferences sharedPreferences = getSharedPreferences(PreferenceManager.getDefaultSharedPreferences(this); 
} 

Тогда один из решений может быть, инициализирует SharedPreferences при инициализации AsyncTask с конструктором:

public SendMail(Context context, String email, String subject, String sharedText1) { 
    //Initializing variables 
    Context context1 = context; // this line is doing nothing.. 
    this.email = email; 
    this.subject = subject; 
    this.sharedText1 = sharedText1; 
    sharedPrefs = context.getSharedPreferences("MySharedPreferences", Context.MODE_PRIVATE); // add this line to initialize variable 
} 

И, наконец, вы можете доступ ко переменной sharedPrefs без исключения нулевого указателя:

sharedPrefs.getString("email_address", "a") 

 Смежные вопросы

  • Нет связанных вопросов^_^