0

我想通过此代码提取在 gmail 中发送邮件的人的邮件 ID,并使用 Media Player 逐字符播放。但是在我声明 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()原因,因为 anAsyncTask没有这样的方法。

您的问题有两种简单的解决方案:

  • 定义MailSender为您的内部类,并使用对外部类的引用进行Activity调用(如:)。MediaPlayer.create(...)MyActivity.this
  • 向您的类添加一个构造函数,该构造函数MailSender引用 a Context,例如Activity您从中启动任务的 。然后MediaPlayer.create(...)用那个Context参考打电话。

此外,我怀疑您是否想MediaPlayer.create(...)从非 UI 线程调用,尽管我不得不承认我没有尝试过。相反,我建议您使用在后台准备播放器的内置方法,称为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.setDataSource(FileDescriptor) 方法创建一个 MediaPlayer 对象并为其设置数据源。您可以使用 AssetManager.openFd() 方法获取 FileDescriptor 对象,然后为返回的对象调用 AssetFileDescriptor.getFileDescriptor() 方法。

于 2012-07-11T04:27:47.513 回答