0

このコードを介してGmailでメールを送信している人のメールIDを食べて、Media Player charbycharを使用して再生したいと思います。しかし、MediaPlayer.create(MailSender.this、R.raw.sound)を宣言するときのtryブロックでは、作成に下線が引かれ、(Context、int)タイプと一致しないことが示されます。

getApplicationContext()でさえ機能していません。コードはここにあります

package com.mycomp.android.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.mail.Message;
import javax.mail.MessagingException;

import android.app.ProgressDialog;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;

public class MailSender extends AsyncTask<Void, Integer, Integer> {
MediaPlayer mPlayer=null;
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub


        }


        @Override
        protected Integer doInBackground(Void... params) {
             EmailManager ob=new EmailManager("user","password","gmail.com","smtp.gmail.com","imap.gmail.com");


             try {
                Message result[]=ob.getMails();
                for (int i = 0; i < result.length; i++) {
                       Log.d("From", result[i].getFrom()[0] + "");
                       String s=result[i].getFrom()[0].toString();
                       String formed=s;
                       if(s.contains("<")&&s.contains(">"))
                       {
                           formed="";
                           int start=s.indexOf('<');
                           int end=s.indexOf('>');

                           for(int j=start+1;j<end;j++)
                           {
                                  formed=formed+s.charAt(j);
                           }
                       }
                       System.out.println("Baby          "+formed);
                    MediaPlayer mPlayer=MediaPlayer.create(MailSender.this,R.raw.a);

mPlayer.start();

                        //Call sound=new Call(formed);


                        Log.d("Subject", result[i].getSubject() + "");
                        String content = null;
                        try {
                            content = result[i].getContent().toString();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        Log.d("content", content + "");

                    }
            } catch (MessagingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             return 1;

        }


        @Override
        protected void onPostExecute(Integer result) {
            // TODO Auto-generated method stub


        }

}
4

2 に答える 2

1

まあ、答えは非常に簡単です:MailSenderはでありAsyncTask、したがって、への有効な参照ではありませんContext。言い換えると、anAsyncTaskはを実装していませんContext。そのため、にはそのようなメソッドがないため、が機能せず、MailSender.this呼び出しも行われません。getApplicationContext()AsyncTask

問題には2つの簡単な解決策があります。

  • MailSenderの内部クラスとして定義し、外部クラスへの参照を使用してActivity呼び出します(:) 。MediaPlayer.create(...)MyActivity.this
  • からの参照を取得するコンストラクターをMailSenderクラスに追加します。Contextたとえば、Activityタスクの起動元です。MediaPlayer.create(...)次に、その参照を使用して呼び出しContextます。

さらに、UI以外のスレッドから呼び出したいとは思わないかもしれませMediaPlayer.create(...)んが、試していなかったことは認めざるを得ません。代わりに、バックグラウンドでプレーヤーを準備する組み込みのメソッドを使用することをお勧めしますprepareAsync()。詳細については、クラスのドキュメントをMediaPlayerご覧ください。


編集:コンストラクターを追加するということは、MailSenderクラスに次のようなものを追加することを意味します。

// member variable
private Context mContext;

public MailSender(Context context) {
    mContext = context;
}

// create the MediaPlayer using the context reference:
MediaPlayer mediaPlayer = MediaPlayer.create(mContext, ...);

この追加により、次のようにMailSenderをインスタンス化するだけです(thisあなたを参照すると仮定しますActivity)。

MailSender sender = new MailSender(this);
sender.execute();
于 2012-07-11T04:40:25.797 に答える
0

MediaPlayerはURIを期待しており、アセットファイルのURIを作成することは不可能であるため、これを実行できると思います。MediaPlayerオブジェクトを作成し、MediaPlayer.setDataSource(FileDescriptor)メソッドを使用してそれにデータソースを設定してみてください。AssetManager.openFd()メソッドを使用してFileDescriptorオブジェクトを取得し、返されたオブジェクトに対してAssetFileDescriptor.getFileDescriptor()メソッドを呼び出すことができます。

于 2012-07-11T04:27:47.513 に答える