![](/img/trans.png)
[英]Which Context to use with MediaPlayer.create() in android?
[英]Not able to set the context for MediaPlayer.create
我想尝试通过此代码以gmail发送邮件的人的邮件ID,然后使用Media Player char by char播放出来。 但是在try块中,当我声明MediaPlayer.create(MailSender.this,R.raw.sound)时,对创建进行下划线标记,并指出该类型与(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
}
}
好吧,答案很简单: MailSender
是一个AsyncTask
,因此不是对Context
的有效引用。 换句话说: AsyncTask
不实现Context
。 这就是为什么MailSender.this
不起作用,也不会调用getApplicationContext()
原因,因为AsyncTask
没有这样的方法。
有两种简单的解决方案可以解决您的问题:
Activity
中将MailSender
定义为内部类,并使用对外部类的引用调用MediaPlayer.create(...)
(例如: MyActivity.this
)。 MailSender
类中添加一个构造函数,该构造函数引用Context
,例如从中启动任务的Activity
。 然后使用该Context
引用调用MediaPlayer.create(...)
。 此外,我怀疑您是否想从非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();
我认为您可以这样做,因为MediaPlayer需要URI,并且不可能为资产文件创建URI。 尝试创建一个MediaPlayer对象,并使用MediaPlayer.setDataSource(FileDescriptor)方法为其设置数据源。 您可以使用AssetManager.openFd()方法获取FileDescriptor对象,然后为返回的对象调用AssetFileDescriptor.getFileDescriptor()方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.