2014-02-06 2 views
4

나는이 문제에 관해서 일을 찾고 있었고, SO와 다른 곳에서 나는 여기에 하나 이상의 적절한 해결책을 찾지 못했다.여러 활동에 걸친 Android backround 음악; 홈 버튼 누르기를 잡는 방법

내 앱 백그라운드에서 오디오 파일을 재생하고 싶습니다. 충분히 쉬워. 음악을 계속 유지하고 내 앱에서 활동 사이를 전환하는 동안 멈추거나 일시 중지하지 않기를 바랍니다.

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     mp = MediaPlayer.create(MainActivity.this, R.raw.lostmexicancity); 
     mp.setLooping(true); 
     mp.start(); 
    } 

문제를 : 또한 매우 간단하고는에서 onCreate 방법이 일을하는 것만으로 달성? HOME 버튼을 누르면 음악이 멈추게됩니다.

사용자가 뒤로 버튼을 눌렀을 때 소리를 죽이는 것이 쉬운 것처럼 보입니다. 여기에 내가 가지고 있고 위대한 작품 :

public void onPause() { 

     if(this.isFinishing()){ //BACK was pressed from this activity 
     mp.stop(); 
     } 

    super.onPause(); } 

꽤 간단한 권리? 네. 복잡하지 않아. 하지만 홈 버튼을 누르지는 못합니다. 홈 버튼을 누르면 사용자가 더 이상 내 앱을 볼 수없는 동안에도 음악이 계속 재생됩니다. 수 시간이나 수 시간 동안 검색 할 때 나는 이것에 대한 간단한 해결책을 찾을 수 없었습니다.

내가해야 할 일이 없으며 사용자에게 위험한 것처럼 보이는 작업 가져 오기의 매니페스트 사용 권한 설정과 관련된 답변을 보았습니다. 게다가 그 해결책은 효과가 없었습니다. 나는 서비스를 사용하는 솔루션을 보았지만 홈 버튼은 이전처럼 음악을 재생하기 때문에 그 중 아무 것도 작동하지 않는다. 왜냐하면 거기에 붙잡을 방법이없는 것 같고 앱을 끝내지 않기 때문이다. 이 작업에 대해 서비스를 사용하라는 메시지가 여러 번 나올 때마다 여러 명이 들어오고 서비스가 적절한 용도가 아니라고 명시해야합니다.)

홈 버튼을 눌렀을 때 음악을 종료하는 유일한 방법 인 것처럼 보입니다. onPause 내에서 비 ​​조건부 stop()을 사용하는 것이지만 활동을 의도와 바꿔서 좋지 않은 활동 사이에서 음악이 끝나기 때문에 호출되므로 좋지 않습니다.

배경 음악과 같은 대단히 일반적인 기능이이 하드이지만 필자와 동일한 문제가있는 게시물과 필자의 활동 내에서 음악을 죽일만한 적절한 답변 이외의 다른 답변은 없다고 상상해보십시오. 앱.

Google Play 스토어의 다른 모든 앱이 어떻게 수행하나요? 온라인에서도 명확한 답변이없는 것 같습니다. 내 말은, 각 onPause()로 음악을 멈추고 시작할 수는 있지만 처음부터 배경 오디오를 반복적으로 시작한다는 것은 말할 것도없고 오디오에서 프로답지 않은 틈을 만드는 것은 받아 들일 수없는 것입니다.

내가 여기에서 간과 할 부분이있을뿐입니다. 도움을 주신 모든 분들께 미리 감사드립니다.

+0

특히 간단한 문제는 아닙니다. 내 경험에 따르면 "배경 음악"을 가진 대부분의 앱은 게임이며 여러 활동을 포함하지 않는 프레임 워크를 사용하여 작성됩니다. 또는 그들은 음악 플레이어이고, 그들은 구체적으로 배경에서 계속 연주하고 싶습니다. 나는 당신이 추구하는 행동으로 게임이 아닌 앱을 본 적이 없다고 말할 수 없다.하나의 충고는 음악 재생이 서비스가 아닌 서비스에 의해 관리되어야한다는 것입니다. 음악이 모든 활동에 걸쳐 있다면. – CommonsWare

+0

다른 많은 게시물에서 이와 비슷한 서비스를 사용하는 것과 관련하여 내 개인이 요청한 내용은 인앱 음악과 같은 서비스에 서비스를 사용해서는 안된다는 사람들의 게시물이있었습니다. 아마도 나는 그 경고를 무시해야합니까? 서비스를 사용하더라도 서비스를 종료하기 위해 홈 버튼을 누르는 방법이 필요합니다. 서비스가 명시 적으로 끝나야하기 때문에 지금 불행히도 Im과 똑같은 상황에 처하게됩니다. – regomar

답변

1

가 난 안드로이드 프로그래밍 (몇 개월) 오늘 새로운 조금, 나는 그것을 다음과 같은 일을했다 당신이 한 동일한 문제 (? 어쩌면 당신은 아직도)

에 직면 MainActivity가 있고 MainActivity에 SecondActivity로 연결되는 Btn2와 ThirdActivity로 연결되는 Btn3이 있다고 가정 해 보겠습니다. 그때 내 이동 중지() 메소드를 구현

public static boolean shouldPlay = false; 

: 부울 shouldPlay가 true로 내 이동 중지로 설정되어있는 경우

public void onStop() { 
    super.onStop(); 
    if (!shouldPlay) { // it won't pause music if shouldPlay is true 
     player.pause(); 
     player = null; 
    } 
} 

은() 원

나는 MainActivity의 시작 부분에 선언 전적으로 불리고 내 음악이 꺼지지 않을 것입니다. 나는 그것을 사실로 정할 때를 결정해야한다. 내가 SecondActivity로 MainActivity에서 전환 할 때, 나는 텐트를 통해 그것을 내가 참으로 shouldPlay을 설정합니다 때이다 :

Button Btn2 = (Button) findViewById(R.id.Btn2); 
    Btn2.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainActivity.this, SecondActivity.class); 
      shouldPlay = true; 
      startActivity(intent); 
     } 
    }); 

을 그리고 같은 Btn3 수행됩니다.

이제 우리가 찾고자하는 마지막 목표는 SecondActivity 또는 ThirdActivity를 방문한 후 MainActivity로 돌아 가면 shouldPlay가 true로 설정된다는 것입니다. 내가 시도한 첫 번째 것은 false로 설정하는 것이었다. 두 번째 및 ThirdActivity가 호출되면 (onCreate()에서) 작동하고 싶다. Main의 onStop()과 다른 호출의 onCreate()가 동시에 호출되기 때문이다. 솔직히 나는 현재 삶의 순환을 얻지 못한다.)

shouldPlay = false; 

이 나를 위해 제대로 작동 : 일을 무엇 false로 홈페이지의 우리에서 onCreate 시작할 때마다() shouldPlay를 설정하는 것입니다. 내가 당신에게 도움이된다면 알려주세요. 건배, bRo.

+1

Brilliant! 나는 솔직히 포기하고 이것에 당신의 해결책은 우수하게 들린다! 나는 그 생각을했으면 좋겠다. – regomar

0
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if(keyCode == KeyEvent.KEYCODE_HOME){ 
     Log.d("Jorgesys", "Home button pressed!!!"); 
    } 
    return super.onKeyDown(keyCode, event); 
} 

하지만 헤이! 이것은 더 이상 4로 작동하지 않습니다.0 +이 읽기 : Capture Home Key Event

을 뒤로 버튼을보십시오 :

isFinishing() :

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     Log.d("Jorgesys", "Back button pressed!!!"); 
    } 
    return super.onKeyDown(keyCode, event); 
} 

, 당신은 방법을 사용하는 미디어 플레이어를 중지하려면 활동의 경우 끝내고, 진실을 돌려 준다; else 은 거짓을 반환하지만 활동이 종료되지 않은 활동 만 일시 중지하고 있습니다. 당신의 MediaPlayer를 재생하는 경우

public void onPause() { 
    if(mp.isPlaying()) 
     { 
     mp.stop(); 
     } 
    super.onPause(); 
} 

활동이 일시 정지에, 평가,이 다음에 해당하는 오디오를 중지하는 경우 :에

public void onPause() { 
     if(this.isFinishing()){ //INCORRECT, Here you are pausing you activity not finishing. 
     mp.stop(); 
     } 
    super.onPause(); 
} 

그렇게 변경합니다.

:

+0

정보를 제공해 주셔서 감사합니다. 그러나 이미 버튼 누르기를 다시 처리했으며 홈 버튼을 눌렀을 때 음악 재생을 멈추는 방법에 대해서만 우려하고 있습니다. Google이이 언론을 감지하는 기능을 제거한 경우 (이유는 무엇입니까? 링크에 감사드립니다.) 나는 음악을 중단하는 방법을 모릅니다. 많은 사용자가 홈 버튼으로 최소화 할 때 배경 음악을 재생하는 앱으로 인해 짜증을 느끼며 관리 할 수있는 수준의 사용자 경험을 제공합니다. – regomar

+0

확인 내 대답을 편집했습니다 – Jorgesys

관련 문제