2013-12-02 2 views
1

Я пишу приложение, которое отправляет электронное письмо с несколькими изображениями в виде вложений. Я проследовал по этой ссылке: Android multiple email attachments using Intent, чтобы настроить намерение электронной почты и прочее. Но сила приложения закрывается, когда я нажимаю кнопку отправки, и это означает, что это исключение Null Pointer.java Null pointer exception after onClick

Вот код для двух классов, которые участвуют (только для электронной части):

PrevEmail.java:

public class PrevEmail extends Activity{ 

Context context; 
TextView tv,tvEmail,tvEmailAd,tvSubject,tvContent,tvLocation; 
EditText etSubject,etContent,etLocation; 
String subject,content,location; 
Button send; 
String btnSelected; 
String[] imgPath; 
Bundle extras; 
ArrayList<Uri> uris; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.prevemail); 
    intializeVar(); 
} 

private void intializeVar() { 
    // Links xml to java 
    tv = (TextView) findViewById(R.id.tv); 
    tvEmail = (TextView) findViewById(R.id.tvEmail); 
    tvEmailAd = (TextView) findViewById(R.id.tvEmailAd); 
    tvSubject = (TextView) findViewById(R.id.tvSubject); 
    tvContent = (TextView) findViewById(R.id.tvContent); 
    tvLocation = (TextView) findViewById(R.id.tvLocation); 

    etSubject = (EditText) findViewById(R.id.Subject); 
    etContent = (EditText) findViewById(R.id.Content); 
    etLocation= (EditText) findViewById(R.id.Location); 

    send = (Button) findViewById(R.id.bSend); 



    extras = getIntent().getExtras(); 
    if(extras!=null){ 
     btnSelected=extras.getString("Button"); 
     imgPath=extras.getStringArray("Path"); 

     //Sets the E-mail field according to the value received by the Bundle. 
     if(btnSelected.equalsIgnoreCase("case1")){ 
      tvEmailAd.setText("email_address"); 
     }else if(btnSelected.equalsIgnoreCase("case2")){ 
      tvEmailAd.setText("email_address"); 
     }else if(btnSelected.equalsIgnoreCase("case3")){ 
      tvEmailAd.setText("email_address"); 
     }else if(btnSelected.equalsIgnoreCase("case4")){ 
      tvEmailAd.setText("email_address"); 
     } 

    } 



    send.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      convertEditTextToString(); 
      Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); 
      emailIntent.setType("text/plain"); 
      emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,"email_address"); 
      emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,subject); 
      emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,content); 

      uris = new ArrayList<Uri>(); 

      for(String file : imgPath) { 
       File fileIn = new File(file); 
       Uri u = Uri.fromFile(fileIn); 
       uris.add(u); 
      } 

      emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
      context.startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
     } 
    }); 

} 

    private void convertEditTextToString(){ 

     subject = etSubject.getText().toString(); 
     content = etContent.getText().toString(); 
     location= etLocation.getText().toString(); 
    }  
    } 

Android манифеста:

<?xml version="1.0" encoding="utf-8"?> 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.name.StartScreen" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter>  
    </activity> 
    <activity 
     android:name="com.example.name.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="com.example.name.MAINACTIVITY" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.example.name.PrevEmail" 
     android:label="@string/app_name">  
    </activity> 
</application> 

И Logcat:

12-02 21:44:48.180: W/dalvikvm(29329): threadid=1: thread exiting with uncaught exception (group=0x40bc4498) 
    12-02 21:44:48.180: E/test(29329): Exception 
    12-02 21:44:48.200: E/AndroidRuntime(29329): FATAL EXCEPTION: main 
    12-02 21:44:48.200: E/AndroidRuntime(29329): java.lang.NullPointerException 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at com.example.name.PrevEmail$1.onClick(PrevEmail.java:100) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at android.view.View.performClick(View.java:4106) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at android.view.View$PerformClick.run(View.java:17150) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at android.os.Handler.handleCallback(Handler.java:615) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at android.os.Handler.dispatchMessage(Handler.java:92) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at android.os.Looper.loop(Looper.java:137) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at android.app.ActivityThread.main(ActivityThread.java:4792) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at java.lang.reflect.Method.invokeNative(Native Method) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at java.lang.reflect.Method.invoke(Method.java:511) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:808) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:575) 
    12-02 21:44:48.200: E/AndroidRuntime(29329): at dalvik.system.NativeStart.main(Native Method) 
+1

Я думаю, что нам не нужно столько кода для отслеживания NPE. Пожалуйста, разместите только соответствующие разделы. –

+0

Вы пробовали отлаживать свой код в том месте, где идет нулевой указатель? Вы должны –

+1

Когда у вас есть «nullpointer», все, что нам нужно увидеть, это ваш logcat и код, на который указывает logcat. Это немного для просеивания. –

ответ

3

Вы никогда не инициализировать

Context context; 

Так, делая context.startActivity(Intent.createChooser(emailIntent, "Send mail..."));, он бросает NPE.

Сообщения Logcat очень полезны для отладки. Эта линия:

at com.example.name.PrevEmail$1.onClick(PrevEmail.java:100) 

указует на то, что что-то is'nt правильно инициализировано на линии 100 вашей деятельности (внутри методы onClick быть точными).

Попробуйте учиться на логарифме, что позволит вам сэкономить много времени.

+0

Спасибо за это. Я изменил эту строку на startActivity (emailIntent), и она работает! Но не могли бы вы рассказать мне, как я мог реализовать метод context.startActivity()? Еще раз спасибо :) – user2125722

+1

@ user2125722 Вы можете инициализировать контекст с помощью 'context = this' в вашем' onCreate() 'методе. –

+0

@ пользователь2125722.Отметить свой ответ принято –

1
send.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     convertEditTextToString(); 
     Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); 
     emailIntent.setType("text/plain"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,"email_address"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,subject); 
     emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,content); 

     uris = new ArrayList<Uri>(); 

     for(String file : imgPath) { 
      File fileIn = new File(file); 
      Uri u = Uri.fromFile(fileIn); 
      uris.add(u); 
     } 

     emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
     context.startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
    } 
}); 

Где-то в этом коде какое-то значение приближается к нулю. Отладчик Eclipse замечательный. Вы должны отлаживать свой код.

Таким образом, вы обнаружите ошибку и решение самостоятельно. Расскажите нам, какая линия 100 в этом классе также

+0

Я буду помнить это, спасибо! Обнаружил ошибку, как указал ZouZou .. :) – user2125722

2

@ZouZou Я верю, что у вас есть правильный ответ. НО Я вижу еще один потенциальный NullPointer; Вы вынудите близко, когда ваш editText пуст, когда вы вызываете этот метод:

convertEditTextToString(); 

Вам нужно будет проверить на нуль на тех, кто первый. То, что я сделал здесь, это сделать ваш метод return bool, и если редактируемый текст не является нулевым, то продолжайте.

@Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if(convertEditTextToString()){ 
     Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); 
     emailIntent.setType("text/plain"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,"email_address"); 
     emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,subject); 
     emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,content); 

     uris = new ArrayList<Uri>(); 

     for(String file : imgPath) { 
      File fileIn = new File(file); 
      Uri u = Uri.fromFile(fileIn); 
      uris.add(u); 
     } 

     emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
     context.startActivity(Intent.createChooser(emailIntent, "Send mail...")); 
    } 
    } 
}); 



private boolean convertEditTextToString(){ 

    subject = etSubject.getText().toString(); 
    content = etContent.getText().toString(); 
    location= etLocation.getText().toString(); 
if(!subject.equals("") && !content.equals("") && !location.equals(""){ 
     return true; 
    } else { 
     Toast.makeText(context, "Please fill out all edit text boxes", Toast.LENGTH_LONG).show(); 
     return false; 
    } 
}  
+0

Хммм, это определенно лучше. Спасибо, что указали! – user2125722

+0

@ user2125722 рад помочь! –