无法为MediaPlayer.create设置上下文

时间:2012-07-11 03:45:31

标签: android gmail

我想通过此代码来抄袭通过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


        }

}

2 个答案:

答案 0 :(得分:1)

嗯,答案很简单:MailSenderAsyncTask,因此不是对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()方法。

相关问题