【问题标题】:Modification of Sound Player on androidandroid上声音播放器的修改
【发布时间】:2014-07-01 14:58:24
【问题描述】:

我正在尝试制作一个简单的钢琴应用程序。我找到了这个教程;http://www.martinhoeller.net/2012/01/13/developing-a-musical-instrument-app-for-android/

我在此链接上下载了文件并将其导入。我运行该应用程序,上面有 4 个按钮,可以播放加载到资产文件中的 4 个不同的音符。

然后我尝试修改这个项目以制作钢琴应用程序。

起初我从 xml 中删除了这些红色按钮。

我在背景中添加了一张钢琴图像。

然后我在每个键上创建了按钮。

xml文件是;

  <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="fill_vertical"
    android:background="@drawable/images"
    android:orientation="vertical" >

    <Button
        android:id="@+id/buttonC4"
        android:layout_width="294dp"
        android:layout_height="60dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />

    <Button
        android:id="@+id/buttonD4"
        android:layout_width="294dp"
        android:layout_height="60dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />

    <Button
        android:id="@+id/buttonE4"
        android:layout_width="294dp"
        android:layout_height="60dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />

    <Button
        android:id="@+id/buttonF4"
        android:layout_width="294dp"
        android:layout_height="58dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />


    <Button
        android:id="@+id/buttonG4"
        android:layout_width="294dp"
        android:layout_height="58dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />

    <Button
        android:id="@+id/buttonA4"
        android:layout_width="294dp"
        android:layout_height="60dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />

    <Button
        android:id="@+id/buttonB4"
        android:layout_width="294dp"
        android:layout_height="58dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />

    <Button
         android:id="@+id/buttonC5"
        android:layout_width="294dp"
        android:layout_height="58dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />

    <Button
        android:id="@+id/buttonD5"
        android:layout_width="294dp"
        android:layout_height="58dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />


    <Button
        android:id="@+id/buttonE5"
        android:layout_width="294dp"
        android:layout_height="58dp"
        android:background="@android:color/transparent"
        android:gravity="center_vertical|center_horizontal" />

</LinearLayout>

然后我在互联网上找到了笔记并下载了它们。

我将这些笔记文件上传到 assets 文件夹。

每一个都是wav格式的。

然后我将这些代码添加到 PianoTest Activity 中;

  buttons = new ArrayList<View>();
 buttons.add(findViewById(R.id.buttonC4));
 buttons.add(findViewById(R.id.buttonD4));
 buttons.add(findViewById(R.id.buttonF4));
 buttons.add(findViewById(R.id.buttonG4));
 buttons.add(findViewById(R.id.buttonA4));
 buttons.add(findViewById(R.id.buttonB4));
 buttons.add(findViewById(R.id.buttonC5));
 buttons.add(findViewById(R.id.buttonD5));
 buttons.add(findViewById(R.id.buttonE5));

然后我修改了这个函数;

private void toggleButtonSound(查看按钮,布尔向下) { 字符串注释 = null;

switch (button.getId())
{
    case R.id.buttonC4:
        note = "C4";
        break;

    case R.id.buttonD4:
        note = "D4";
        break;
    case R.id.buttonE4:
        note = "E4";
        break;

    case R.id.buttonF4:
        note = "F4";
        break;

    case R.id.buttonG4:
        note = "G4";
        break;
    case R.id.buttonA4:
        note = "A4";
        break;

    case R.id.buttonB4:
        note = "B4";
        break;

    case R.id.buttonC5:
        note = "C5";
        break;

    case R.id.buttonD5:
        note = "D5";
        break;
    case R.id.buttonE5:
        note = "E5";
        break;
}

然后我更改了 AudioTrack 类。我将格式更改为 wav 文件;

public void run()
    {
        try
        {
            String path = note + ".wav";

其他一切都与原始项目相同。

但应用程序无法正常运行。

当我运行应用程序并单击一个按键上的透明按钮时,它会播放声音,但它与原来的声音不同。

听起来有些不同。我可以说是电子版的笔记。

当我单击其他一些键时,应用程序崩溃。它说应用程序意外停止。

怎么了?我应该怎么做才能让它工作?原因可能是我下载的文件。我需要找到什么样的笔记?这个项目的比特或持续时间有什么特殊的格式吗?

这对我来说很重要,如果你可以从链接下载文件并运行,你可以看到它是如何工作的。你可以建议我修改它的方法。我希望你能帮助我。 这是日志猫:

05-13 19:49:55.580: D/AndroidRuntime(485): Shutting down VM
05-13 19:49:55.580: W/dalvikvm(485): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
05-13 19:49:55.600: E/AndroidRuntime(485): FATAL EXCEPTION: main
05-13 19:49:55.600: E/AndroidRuntime(485): java.lang.RuntimeException: Unable to start activity ComponentInfo{net.martinhoeller/net.martinhoeller.PianoTestActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class ButtonView
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.os.Looper.loop(Looper.java:123)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-13 19:49:55.600: E/AndroidRuntime(485):  at java.lang.reflect.Method.invokeNative(Native Method)
05-13 19:49:55.600: E/AndroidRuntime(485):  at java.lang.reflect.Method.invoke(Method.java:521)
05-13 19:49:55.600: E/AndroidRuntime(485):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-13 19:49:55.600: E/AndroidRuntime(485):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-13 19:49:55.600: E/AndroidRuntime(485):  at dalvik.system.NativeStart.main(Native Method)
05-13 19:49:55.600: E/AndroidRuntime(485): Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class ButtonView
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
05-13 19:49:55.600: E/AndroidRuntime(485):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.app.Activity.setContentView(Activity.java:1647)
05-13 19:49:55.600: E/AndroidRuntime(485):  at net.martinhoeller.PianoTestActivity.onCreate(PianoTestActivity.java:23)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
05-13 19:49:55.600: E/AndroidRuntime(485):  ... 11 more
05-13 19:49:55.600: E/AndroidRuntime(485): Caused by: java.lang.ClassNotFoundException: android.view.ButtonView in loader dalvik.system.PathClassLoader[/data/app/net.martinhoeller-1.apk]
05-13 19:49:55.600: E/AndroidRuntime(485):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
05-13 19:49:55.600: E/AndroidRuntime(485):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
05-13 19:49:55.600: E/AndroidRuntime(485):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.view.LayoutInflater.createView(LayoutInflater.java:466)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:544)
05-13 19:49:55.600: E/AndroidRuntime(485):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
05-13 19:49:55.600: E/AndroidRuntime(485):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
05-13 19:49:55.600: E/AndroidRuntime(485):  ... 20 more
05-13 19:52:22.293: D/AndroidRuntime(513): Shutting down VM
05-13 19:52:22.293: W/dalvikvm(513): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
05-13 19:52:22.309: E/AndroidRuntime(513): FATAL EXCEPTION: main
05-13 19:52:22.309: E/AndroidRuntime(513): java.lang.ArrayIndexOutOfBoundsException
05-13 19:52:22.309: E/AndroidRuntime(513):  at net.martinhoeller.PianoTestActivity.onTouchEvent(PianoTestActivity.java:66)
05-13 19:52:22.309: E/AndroidRuntime(513):  at android.app.Activity.dispatchTouchEvent(Activity.java:2089)
05-13 19:52:22.309: E/AndroidRuntime(513):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655)
05-13 19:52:22.309: E/AndroidRuntime(513):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1785)
05-13 19:52:22.309: E/AndroidRuntime(513):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-13 19:52:22.309: E/AndroidRuntime(513):  at android.os.Looper.loop(Looper.java:123)
05-13 19:52:22.309: E/AndroidRuntime(513):  at android.app.ActivityThread.main(ActivityThread.java:4627)
05-13 19:52:22.309: E/AndroidRuntime(513):  at java.lang.reflect.Method.invokeNative(Native Method)
05-13 19:52:22.309: E/AndroidRuntime(513):  at java.lang.reflect.Method.invoke(Method.java:521)
05-13 19:52:22.309: E/AndroidRuntime(513):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-13 19:52:22.309: E/AndroidRuntime(513):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-13 19:52:22.309: E/AndroidRuntime(513):  at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 我们至少需要查看 logcat 堆栈跟踪以了解崩溃情况以及您用于播放音符的方法以提供帮助。以及您在布局中使用 TextView 而不是 Button 视图类型的任何特殊原因?
  • 感谢您的评论。如何在此处添加 logcat?
  • 我没有更改任何其他内容。其余代码部分与原始代码部分相同。在资产文件夹中有笔记文件 C4.wav 、 E4。 wav 等...
  • 您正在尝试使用名为ButtonView 的类,但它在您的项目中不存在(或未正确导入)。您确定这是正在使用的布局吗?请在您的活动中添加onCreate()
  • 在我将每个 textview 都更改为 buttonview 后没有发生这种情况。

标签: audio media playback assets piano


【解决方案1】:

您似乎有很多问题。让我们先尝试修复布局膨胀崩溃。

List<Button> buttons;
...
buttons = new ArrayList<Button>();
buttons.add((Button)findViewById(R.id.buttonC4));
buttons.add((Button)findViewById(R.id.buttonD4));
...
for (Button button : buttons) {
    button.setOnClickListener(this);
}

这将正确转换布局的按钮视图并为每个视图设置一个 OnClickListener。
您的活动需要implement View.OnClickListener 才能使用setOnClickListener(this)。如果您将点击处理分开,则替换为适当的类,在这种情况下,该类将 implement OnClickListener 而不是您的 Activity。

【讨论】:

  • 谢谢,但您检查了链接吗?
  • 我快速浏览了一下,但我不打算通读整个内容或尝试自己创建一个有效的实现。您可以自行制定问题,使其包含人们帮助您所需的所有信息,而无需花费大量时间重新创建所有代码。清晰、简洁、完整、直接就是方式。
  • 实际上原始项目有效,由于其中有 4 个声音文件,我只想再添加 3 个并创建一个带有 7 个音符的简单钢琴应用程序。原始项目 4 个音符正在播放,但我下载的其他 3 个文件无法正常播放或有时从未播放。我刚刚添加了 3 个原始文件作为原始文件。我在项目中调用它们,就像原来的一样。但是这三个音符听起来不像一个音符。它们就像汽车的喇叭。我是认真的。他们被当作别的东西来玩。我不知道为什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
相关资源
最近更新 更多