2016-10-15 4 views
1

나는이 모든 것을 배울 수 있도록이 앱을 작성하기 시작했습니다.안드로이드 조각에서 소리가 onClick 이벤트 후 재생되지 않습니다

이 앱은 클릭 할 때 이미지가 소리를내는 일련의 '스 와이프 할 수있는'화면으로 구성된 보조 활동으로 이어지는 클릭 가능한 이미지 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 파일입니다. 초

<?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 ondary.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> 

응용의 컴파일 및 실행은 (croc.xml 및 camel.xml은 동일)하지만 난 어떤 조각에 모든 이미지를 클릭하면 소리가 없다 연주. 내 장치에서 에뮬레이션을 시도했지만 아무것도하지 않았습니다.

내가 잘못 했습니까? 내가 라인에 v.getContext()getActivity()을 변경 시도

:

`mp = MediaPlayer.create(getActivity(), R.raw.lioncub2);` 

하지만 아무것도 변경되지 않습니다. 모든 사운드 파일은 mp3입니다. 나는 또한 세 개의 이미지가있는 조각이없는 secondaryPage.java 버전을 작성하여 mp3 파일이 정상적으로 재생되는지 확인할 수 있습니다. 또한 onClick() 메서드가 작동하는지 확인하기 위해 Toast 메시지를 삽입했습니다. 디버그하고 mp = MediaPlayer.create(getActivity(), R.raw.lioncub2); 행으로 들어가서 계속하면 사운드가 재생됩니다. 사전에 어떤 도움

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: [email protected] 
10-15 10:50:39.482 2459-2459/com.example.testfrags I/AnimalsFragment: mp after release: null 

감사 :

다음은 Log.i 문의 출력입니다!

답변

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); 

감사합니다!

1

문제가 발생하면 미디어 플레이어가 시작될 때 즉시 중지하고 해제하는 것입니다. 코드에서 stop 메서드를 제거하면 사운드가 재생됩니다. MediaPlayer

주위에 많은 작업을 필요로하기 때문에 사운드 또는 오디오가 기간이 작은 경우

이제 막 제거 스톱은 이제 MediaPlayer 클래스를 사용하려면 몇 가지 작업을 할 필요가 전체 문제가 해결되지 않습니다 SoundPool 클래스를 사용해야합니다.

귀하의 문제는 이전에 내가 대답 한이 질문과 비슷하게 보입니다.

조각을 들고 활동 클래스에서 mediaPlayer를 선언 그냥 MainActivity의를 추가하려면 조각 지금 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; 
    .... 
    } 
.... 
} 

을 구현 : 1

솔루션 : link

문제를 해결하려면 다음과 같은 참조 :

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(); 

      .... 
      .... 
     ....} 

희망 하시겠습니까?

+0

대단히 감사합니다. stop 메소드를 삭제했지만 아무 것도 변경되지 않았습니다. 이전에 MediaPlayer (아무 조각 코딩도) 파일을 재생산하는데 문제가 없었으므로 지금 왜 작동하지 않는지 알 수 없습니다. – BletchleyP

+0

내가 먼저 듣고 싶은 대답은 짧거나 길습니까? –

+0

그것은 당신에게 아주 친절합니다. 오디오 파일은 mp3 파일의 동물 소리이므로 너무 길지 않습니다. – BletchleyP

관련 문제