繁体   English   中英

无法设置MediaPlayer.create的上下文

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM