2

メールを送信するためのアプリケーションを設計しています。すべてが設定されていますが、コードがエミュレーターの次の行に到達すると、「アプリケーションが予期せず停止しました」と表示され、ログ cat に NullPointerException が表示されます。私はまた、私が見つけた限り多くの許可を与えました。マニフェスト ファイルで指定する必要がある特定のアクセス許可と、問題を解決する方法を教えてください。

startActivity(Intent.createChooser(send, "This is the chooser title"));

送信はここでの私の意図です。

完全なログ cat msg は次のとおりです。

11-01 23:21:37.721: W/IInputConnectionWrapper(442): showStatusIcon on inactive InputConnection
11-01 23:21:39.781: I/msg(442): this is offhook
11-01 23:21:43.991: I/msg(442): this is idle
11-01 23:21:43.991: I/msgfinal(442): this is it
11-01 23:21:43.991: I/msg(442): this is from msg
11-01 23:21:43.991: I/sha(442): here
11-01 23:21:43.991: D/AndroidRuntime(442): Shutting down VM
11-01 23:21:43.991: W/dalvikvm(442): threadid=1: thread exiting with uncaught exception (group=0x40015560)
11-01 23:21:43.991: E/AndroidRuntime(442): FATAL EXCEPTION: main
11-01 23:21:43.991: E/AndroidRuntime(442): java.lang.NullPointerException
11-01 23:21:43.991: E/AndroidRuntime(442):  at android.app.Activity.startActivityForResult(Activity.java:2827)
11-01 23:21:43.991: E/AndroidRuntime(442):  at android.app.Activity.startActivity(Activity.java:2933)
11-01 23:21:43.991: E/AndroidRuntime(442):  at com.example.dialing.MainActivity.fun(MainActivity.java:33)
11-01 23:21:43.991: E/AndroidRuntime(442):  at com.example.dialing.PhoneCallListener.onCallStateChanged(MainActivity.java:104)
11-01 23:21:43.991: E/AndroidRuntime(442):  at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:319)
11-01 23:21:43.991: E/AndroidRuntime(442):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-01 23:21:43.991: E/AndroidRuntime(442):  at android.os.Looper.loop(Looper.java:123)
11-01 23:21:43.991: E/AndroidRuntime(442):  at android.app.ActivityThread.main(ActivityThread.java:3683)
11-01 23:21:43.991: E/AndroidRuntime(442):  at java.lang.reflect.Method.invokeNative(Native Method)
11-01 23:21:43.991: E/AndroidRuntime(442):  at java.lang.reflect.Method.invoke(Method.java:507)
11-01 23:21:43.991: E/AndroidRuntime(442):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-01 23:21:43.991: E/AndroidRuntime(442):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-01 23:21:43.991: E/AndroidRuntime(442):  at dalvik.system.NativeStart.main(Native Method)
11-01 23:21:48.481: I/Process(442): Sending signal. PID: 442 SIG: 9

「ここ」(6行目)までがLogですのでご注意ください。私がチェックのために与えたのは、startActivity関数の直前の行です。

        Intent msg=new Intent(Intent.ACTION_SEND);
        String[] recipients={"myid@gmail.com"};

        msg.putExtra(Intent.EXTRA_EMAIL, recipients);

        msg.putExtra(Intent.EXTRA_TEXT, "This is the email body");
        msg.putExtra(Intent.EXTRA_SUBJECT, "This is the email subject");

        //msg.setType("message/rfc822");
        msg.setType("*/*");

        //context.startActivity(Intent.createChooser(msg, "This is the chooser title"));
        Log.i("msg","this is from msg");

        //calling into main activity
        MainActivity ma=new MainActivity();
        ma.fun(msg);

//この関数は mainActivity 内にあります

public void fun(Intent send)
{
    Log.i("sha","here");
    startActivity(Intent.createChooser(send, "This is the chooser title"));

    Log.i("sha","here2");
}
4

4 に答える 4

5

この方向に行ってください:

Intent email = new Intent(Intent.ACTION_SEND);
    email.putExtra(Intent.EXTRA_EMAIL,new String[] { "rahul@mail.com"});
    email.putExtra(Intent.EXTRA_SUBJECT,"Contact Us");
    email.putExtra(Intent.EXTRA_TEXT,"sent a message using the contact us ");

    email.setType("message/rfc822");

    startActivityForResult(Intent.createChooser(email, "Choose an Email client:"),
                        1);

次に、メソッドを作成しますonActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(requestCode == MY_REQUEST_CODE) {
        if(resultCode == RESULT_OK) {


        } else {

            Intent ingoHome = new Intent(abc.this,
                    pqr.class);
            ingoHome.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(ingoHome);


        }
    }

    finish();

}
于 2012-11-02T04:14:28.517 に答える
1

これを試して 。. . . . それは正常に動作します。

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); 
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{""}); 
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,""); 
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,""); 
startActivity(Intent.createChooser(emailIntent, "Send mail..."));

メールに他のファイルを添付する必要がある場合は、「emailIntent.putExtra();」に追加できます。

于 2012-11-02T03:53:52.270 に答える
0

java.lang.NullPointerExceptionは基本的に、(まだ) 存在しないオブジェクトを参照していることを意味します。

次の行をコメントアウトまたは削除してみてください。

MainActivity ma=new MainActivity();
ma.fun(msg);

そして、変数名に一致する MainActivity.fun(Intent msg) メソッドのコードに置き換えます。

Log.i("sha","here");
startActivity(Intent.createChooser(msg, "This is the chooser title"));
Log.i("sha","here2");

私があなたのコードを正しく読んでいる場合、あなたは current の別のインスタンスを作成し、 currentのを含むActivityを渡そうとしています。あなたはすでに のインスタンスにいました(Android によってインスタンス化されました)。IntentContextActivityMainActivity

編集: startActivity と startActivityforResult はどちらも別のアクティビティを起動し、startActivityforResult は最初のアクティビティのコールバックに結果が返されることを期待しています。最初に startActivity を機能させることに取り組みます。必要に応じて、いつでも startActivityforResult に変換できます。

アプリが でクラッシュしMainActivity.fun(MainActivity.java:33)ていたため、インスタンス化される前に startActivity が「send」を受け取っている可能性があります。

私は他のすべての人に反響し、あなたのコードが機能するはずだと言います..巨大なコンテキスト外コードブロックが fun() メソッドを呼び出す唯一の場所である限り。すべてを独自のメソッドに入れると、次のようになります。

class MainActivity extends Activity {
    private static final String TAG = Controller.class.getSimpleName();

    /* fields, other methods */

    private void sendMail(){
        Intent msg=new Intent(Intent.ACTION_SEND);
        String[] recipients={"myid@gmail.com"};
        msg.putExtra(Intent.EXTRA_EMAIL, recipients);
        msg.putExtra(Intent.EXTRA_TEXT, "This is the email body");
        msg.putExtra(Intent.EXTRA_SUBJECT, "This is the email subject");
        // I personally use application/octet-stream because it
        // shows all my email clients, but not much other useless stuff.
        // Might get me flamed, though lol :)
        msg.setType("application/octet-stream");
        MainActivity.this.getApplicationContext().startActivity(
            Intent.createChooser(msg, "This is the chooser title")
        );
        Log.i(TAG,"made it! :D");
    }/*end sendMail()*/

    /* more fields and methods */

}/*end MainActivity*/
于 2012-11-02T04:55:37.143 に答える
0

問題は、使用するコンテキストです。コードはちょうどいいです。使わないだけ

MainActivity ma=new MainActivity();
ma.fun(msg);

のように使う

MainActivity.this.fun(msg);
于 2012-11-02T04:27:55.783 に答える