【问题标题】:Playing musics with ImageButton android使用 ImageButton 播放音乐
【发布时间】:2014-06-26 07:26:06
【问题描述】:

我有一个想要用 ImageButton 播放的音乐 (.mp3) 列表,我想用它的 ID 播放每个声音

首先,我有一个包含字段 _id 的数据库。然后,我尝试了

 final String ambil = kata.get(3)

用于从我使用的查询中检索 _id。然后,我用了

speaker.setTag(ambil);

speaker 是一个 ImageButton,我想用它的 _id 标记每个按钮,这样它会使声音彼此不同。

然后,我订购了我拥有的所有声音文件

int names[] = {R.raw.a,R.raw.a,R.raw.c};

最后,我想用这个创建一个 MediaPlayer

MediaPlayer mp = MediaPlayer.create(LazyAdapter.this, R.raw.names[ambil]);

我的算法对吗?

【问题讨论】:

  • 你的阵列是什么样子的?它是一个只有 mp3 名称的字符串数组吗?相反,您可以做一个整数数组,如 int[]names={R.raw.baby,R.raw.forest};然后像 MediaPlayer.create(this,names[0]) 或 MediaPlayer.create(this,names[1]) 一样传递它
  • 我明白你的意思,但我收到一个错误,显示 MediaPlayer 中的方法 create(Context,URI) 不适用于参数。这是什么意思?
  • 出了点问题。 mediaPlayer 可以通过一些不同的方式创建。一个是,传递一个文件的URI,另一个是传递资源。你能告诉我你是怎么做到的吗?
  • 我已经编辑了我的问题。我希望你能理解这些代码。供您参考,这不在 Activity 中,只是一个类
  • 啊,哦,不,我不是这个意思...我会写一个答案来更好地解释它

标签: java android database sqlite


【解决方案1】:

现在,我将提示如何以简单的方式完成它。您可以使用原始资源创建数组:

 int names[] = new int {R.raw.a,R.raw.b,R.raw.c};

不要像你做的那样创建一个字符串数组,这是行不通的。使用上面的示例并像这样创建媒体播放器:

 MediaPlayer mp = MediaPlayer.create(LazyAdapter.this, names[0]);

编辑

从你上面的例子中,我看到了一些错误的东西。

首先,您不能传递字符串来识别数组的编号。你是这样做的:

     final String ambil = kata.get(3)

而您试图获取 mediaPlayer 的资源,例如:

     MediaPlayer mp = MediaPlayer.create(LazyAdapter.this, R.raw.names[ambil]);

你传递一个字符串来从names[] ---> R.raw.names[ambil]]中获取资源; 不要写 R.raw.names[],只写 names[]。

另外,您必须传递一个整数才能从数组中获取值,例如:

      names[0]

问题是,你从你的数据库中得到哪个整数,你说你得到一个 id,但值是多少?为了解释,如果你写 names[0],那意味着你得到了数组的第一个值(因为数组从 0 开始)。在您的情况下,您指的是资源 R.raw.a 。如果你想引用第二首歌,你必须写名字[1]。

我不知道您是如何实现数据库的以及您以何种方式提供 _id。但是请确保您以 _id 的方式给出,它不会高​​于资源的数量。如果您创建了一个自动增量 id,那么它在该值高于歌曲数量的情况下将不起作用。

【讨论】:

  • 先生,您还在吗?
【解决方案2】:

你可以试试这个:

首先,使用文件名获取资源ID:

int rid = context.getResources()
        .getIdentifier("filename","raw", context.getPackageName());

然后在输入流中获取文件:

InputStream iS;
iS = getResources().openRawResource(rID);

更多解释可以参考this post

Another post for reference

希望对你有帮助。

【讨论】:

  • 感谢先生您的回复。下一步是MediaPlayer mp = MediaPlayer.create(this,iS) 吗?
  • mp.setDataSource(iS.getFD());@MichaelRoring
  • .getFD() 代表什么?
  • 抱歉,好像是 inputFileStream 的。
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多