我想通过此代码来抄袭通过gmail发送邮件的人的邮件ID,并使用媒体播放器char by char进行播放。但是在我声明MediaPlayer.create(MailSender.this,R.raw.sound)时的try块中,create被加下划线并且表示它与(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
}
}
答案 0 :(得分:1)
嗯,答案很简单:MailSender
是AsyncTask
,因此不是对Context
的有效引用。换句话说:AsyncTask
未实现Context
。这就是为什么MailSender.this
无效,也不会调用getApplicationContext()
,因为AsyncTask
没有这样的方法。
您的问题有两种简单的解决方案:
MailSender
定义为Activity
中的内部类,并使用对外部类的引用调用MediaPlayer.create(...)
(如:MyActivity.this
)。MailSender
类中添加一个构造函数,该类引用Context
,例如从中启动任务的Activity
。然后使用MediaPlayer.create(...)
引用来致电Context
。此外,我怀疑你是否想要从非UI线程调用MediaPlayer.create(...)
,但我不得不承认我没有尝试过。相反,我建议您使用在后台准备播放器的内置方法,称为prepareAsync()
。有关详细信息,请参阅the documentation for the MediaPlayer
class。
修改:通过添加构造函数,我的意思是向您的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();
答案 1 :(得分:0)
我认为你可以这样做,因为MediaPlayer需要一个URI,而且无法为资产文件创建URI。尝试使用MediaPlayer.setDataSource(FileDescriptor)方法创建MediaPlayer对象并为其设置数据源。您可以使用AssetManager.openFd()方法获取FileDescriptor对象,然后为返回的对象调用AssetFileDescriptor.getFileDescriptor()方法。