我是新手,所以我开始编写这个应用程序来学习。
该应用程序以6个可点击的图像开始,这些图像会导致由一系列"可滑动的"每个屏幕都有一个图像,当点击时会生成一个声音。以下是生成屏幕所需的辅助代码和片段代码的代码:
SecondaryPage.java
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
public class SecondaryPage extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the content of the activity to use the activity_main.xml layout file
setContentView(R.layout.secondary);
// Find the view pager that will allow the user to swipe between fragments
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
// Create an adapter that knows which fragment should be shown on each page
SimpleFragmentPagerAdapter adapter = new SimpleFragmentPagerAdapter(getSupportFragmentManager());
// Set the adapter onto the view pager
viewPager.setAdapter(adapter);
}
}
SimpleFragmentAdapter.java
AnimalsFragement.java(Croc()
和Camel()
相同,但名称除外)
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import static com.example.testfrags.R.layout.animals;
public class AnimalsFragment extends Fragment {
private ImageView imageView;
private MediaPlayer mp;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = null;
//Inflating View to access it's resources
v = inflater.inflate(animals, container, false);
Log.i("AnimalsFragment", "mp before playing: " + mp);
//creating clickable image
imageView = (ImageView) v.findViewById(R.id.jungle_animals);
// Sound played once clicked
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Start playback.
mp = MediaPlayer.create(getActivity(), R.raw.lioncub2);
Log.i("AnimalsFragment", "mp: " + mp);
mp.start();
mp.stop();//Stops playback - added precaution
// release media resources
releaseMediaPlayer();
Log.i("AnimalsFragment", "mp after release: " + mp);
// Little msg confirm end of sound
Toast.makeText(v.getContext(), "Questo era il Leoncino", Toast.LENGTH_SHORT).show();
}
});
return v;
} // end of onCreatView
/**
* Clean up the media player by releasing its resources.
*/
private void releaseMediaPlayer() {
// If the media player is not null, then it may be currently playing a sound.
if (mp != null) {
// Regardless of the current state of the media player, release its resources
// because we no longer need it.
mp.reset();
mp.release();
// Set the media player back to null.
} // end of if
} // end of releaseMediaPlayer
@Override
public void onStop() {
super.onStop(); // Always call the superclass method first
releaseMediaPlayer();
}
}
这些是xml文件: secondary.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
animals.xml(croc.xml和camel.xml是相同的)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:id="@+id/jungle_animals"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/lion"/>
</LinearLayout>
应用程序编译并运行但是当我点击任何片段中的任何图像时,没有播放声音。我已经在我的设备上尝试了两个并且模拟但没有。
我做错了什么?
我尝试在行中更改getActivity()
v.getContext()
:
`mp = MediaPlayer.create(getActivity(), R.raw.lioncub2);`
但没有任何改变。
所有声音文件都是mp3。我还编写了一个版本的secondaryPage.java,没有带有三个图像的片段,只是为了看看mp3文件是否有效,它们都正常播放。
我还插入了Toast
消息,以检查onClick()
方法是否正常工作。
当我调试并进入mp = MediaPlayer.create(getActivity(), R.raw.lioncub2);
行并继续时,会播放声音。
以下是Log.i语句的输出:
10-15 10:50:36.962 2459-2459/com.example.testfrags I/Croc: mp before playing: null
10-15 10:50:37.682 2459-2459/com.example.testfrags I/Choreographer: Skipped 36 frames! The application may be doing too much work on its main thread.
10-15 10:50:39.472 2459-2459/com.example.testfrags I/AnimalsFragment: mp: android.media.MediaPlayer@b0fd1480
10-15 10:50:39.482 2459-2459/com.example.testfrags I/AnimalsFragment: mp after release: null
提前感谢您的帮助!
答案 0 :(得分:1)
您的问题是您正在停止并在启动后立即释放媒体播放器。从代码中删除stop方法,将播放声音。
如果您想使用MediaPlayer
类,因为MediaPlayer
需要大量的解决方法,现在只是删除停止将无法解决您的整个问题,您必须立即开始工作
如果您的声音或音频持续时间较短,则应使用SoundPool
课程。
你的问题似乎与我之前回答的这个问题类似。link
解决您的问题:
解决方案1:
在包含片段的Activity类中声明mediaPlayer
并实现TabLayout.OnTabSelectedListener
... MainActivity extends AppCompatActivity implements TabLayout.OnTabSelectedListener{...
MediaPlayer mediaPlayer = null;
....
@Override
public void onTabSelected(TabLayout.Tab tab)
{
int position= tab.getPosition();
switch(position)
{
case 1: if(mediaPlayer!=null)
{
mediaPlayer.stop();
mediaPlayer.realse();
}
break;
case 2: if(mediaPlayer!=null)
{
mediaPlayer.stop();
mediaPlayer.realse();
}
break;
....
}
....
}
现在在你的Fragment中添加MainActivity的引用如下:
public class AnimalsFragment extends Fragment {
private ImageView imageView;
private MainActivity mainActivity;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = null;
mainActivity=(MainActivity)getActivity();
....
....
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Start playback.
mainActivity.mediaPlayer=MediaPlayer.create(mainActivity, R.raw.song);
mediaPlayer.start();
....
....
....}
我希望这会奏效。
答案 1 :(得分:0)
它的价值......
代码中的错误是在声音实际结束之前调用releaseMediaPlayer
方法。
所以我应该通过添加某种形式的控件来检查这一点,我使用MediaPlayer.OnCompletionListener
。
我通过定义变量并调用MediaPalyer.OnCompletionListner
:
private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
// Now that the sound file has finished playing, release the media player resources.
releaseMediaPlayer();
}
然后在声音开始播放后立即调用以下内容:
mp.setOnCompletionListener(mCompletionListener);
感谢所有人!