在Android中点击按钮时播放声音
问题描述:
我是Android新手,我试图做一些简单的操作,比如单击按钮时播放自定义MP3。这似乎是一个fairlycommonquestion,但即使我的代码遵循的例子,我没有得到任何错误,我没有听到模拟器或真正的手机中的任何声音。在Android中点击按钮时播放声音
我MainActivity.java:
public class MainActivity extends Activity {
private static final String TAG = "MyActivity";
public void MyActivity(Bundle onSavedStateInstance) {
Log.v(TAG, "Initializing sounds...");
final MediaPlayer mp = MediaPlayer.create(this, R.raw.alarma_67560);
Button play_button = (Button)this.findViewById(R.id.play_button);
play_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.v(TAG, "Playing sound...");
mp.start();
}
});
Log.v(TAG, "Sounds initialized.");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
而且我activity_main.xml中:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
tools:context=".MainActivity" />
<Button
android:id="@+id/play_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/play_button" />
</RelativeLayout>
我使用的Eclipse插件,它不显示任何错误,开发和似乎运行应用程序在模拟器或真正的手机中正确,但是当我点击播放按钮时,没有任何反应。我不确定模拟器是否支持声音(但我假设它是这样的),并且我已经确认声音在手机上取消静音。
我在做什么错?
此外,我没有看到我的日志语句显示在任何地方,无论是在Eclipse的控制台或LogCat面板。我应该看到那些打印的地方?
答
这不会工作的一个非常简单的原因:MyActivity()永远不会被调用。
Android会调用您的Activity的onCreate(),但其他方法调用必须由您完成。因为你永远不会称你为MyActivity()方法,所以该按钮永远不会被赋予onClickListener(),并且声音从不播放。请尝试使用下面的代码来代替:
public class MainActivity extends Activity {
private static final String TAG = "MyActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v(TAG, "Initializing sounds...");
final MediaPlayer mp = MediaPlayer.create(this, R.raw.alarma_67560);
Button play_button = (Button)this.findViewById(R.id.play_button);
play_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.v(TAG, "Playing sound...");
mp.start();
}
});
Log.v(TAG, "Sounds initialized.");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
答
你应该把你的代码的setContentView()内的onCreate后,因为你的方法/构造公共无效MyActivity(捆绑onSavedStateInstance)永远不会被调用,因此永远不会执行你的代码。类似这样的:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.v(TAG, "Initializing sounds...");
final MediaPlayer mp = MediaPlayer.create(this, R.raw.alarma_67560);
Button play_button = (Button)this.findViewById(R.id.play_button);
play_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.v(TAG, "Playing sound...");
mp.start();
}
});
Log.v(TAG, "Sounds initialized.");
}
你可能想调用一些简单的东西,如'MusicManager.getInstance()。play(this,R.raw.my_sound);'。为此,您需要正确的资源管理。您可以为此使用一个轻量级库:https://github.com/delight-im/Android-Audio – caw 2015-04-01 22:43:05