안드로이드로 음악 재생을 해보는 앱.
18303 단어 Android
사이트 축소판 그림
우선 참고 사이트를 하나 들겠습니다.
또 글을 일찍 쓰기 때문에 최근 OS로 조작하려면 외부 저장된 읽기 권한을 추가해야 한다.
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
음악 재생 프로그램 확장
원래 하고 싶었던 것은 그룹이 부른 노래와 연동해 누가 노래하는지 보여주는 것이다.
이에 따라 LED 제어에 앞서 노래 부르는 부분을 음악 플레이어에 추가로 알리는 기능이 추가됐다.
누가 노래하고 있는지 어떻게 판단합니까?이번에는 인력으로 얼렁뚱땅 속인 거예요
미리 시간에 따라 노래를 부르는 사람의 데이터를 만든다.
(혼합된 음원에서 분리·해석하는 것은 상당히 어렵다.변화를 추출하는 타이밍 등 자동화하는 경우도 있지만 개발에 상당한 시간이 소요되기 때문에 향후 과제로 삼는다.)
따라서 음악 재생 서비스는 다음과 같이 확장될 것이다.
BLE Nano와의 통신 애플리케이션 측에서 Broadcast intent를 수신하여 BLED Nano에 LED 제어 신호를 보냅니다.
(분리 응용 프로그램은 서로 다른 샘플 코드에서 확장되기 때문에 분리하면 제작이 더욱 쉽다. 다시 설계하여 통일적으로 만들고 싶지만 일손이 부족하다.
따라서 데이터 형식, 읽기 방법과 데이터 발송에 대해 좀 더 상세하게 쓰고 싶습니다.
악곡 데이터 형식
데이터 형식은 이렇다.
data.json
{
"Time":[0,5972,11133,18000,28339],
"v0":[0,3,3,0,3],
"v1":[0,3,3,0,0],
"v2":[0,3,3,0,0],
"v3":[0,3,3,0,3],
"v4":[0,3,3,0,0],
"v5":[0,3,3,0,0],
"v6":[0,4,4,0,0]
}
읽기 쉽기 때문에 JSON 형식을 사용합니다.내용은 노래 형식이 바뀐 시기와 당시 각 멤버가 불렀던 어디의 표다.
(사실 더 길지만 샘플이라 처음 5개 만)
패턴 변경 시간을 배열 Time에서 밀리초 단위로 저장합니다.
그리고 멤버마다 그 타이밍에 노래 부르는 높이는 1~5리에 저장돼 있다.
악곡 데이터의 읽기
이 악곡 데이터는 음악 재생이 시작될 때 미리 읽는다.
mJAtime,v0,mJAv0,mJAv0,mJA..의 JSONarray 객체에서 로드됩니다.
MusicPlayerService.javapublic class MusicPlayerService extends Service implements OnCompletionListener,
:
private int mJAIndex = 0;
private JSONArray mJAtime;
private JSONArray mJAv0;
private JSONArray mJAv1;
private JSONArray mJAv2;
private JSONArray mJAv3;
private JSONArray mJAv4;
private JSONArray mJAv5;
private JSONArray mJAv6;
:
public void onPrepared(MediaPlayer player) {
readFile();
:
}
private void readFile() {
:
try {
mJObj = new JSONObject(json_data);
mJAtime = mJObj.getJSONArray("Time");
mJAv0 = mJObj.getJSONArray("v0");
mJAv1 = mJObj.getJSONArray("v1");
mJAv2 = mJObj.getJSONArray("v2");
mJAv3 = mJObj.getJSONArray("v3");
mJAv4 = mJObj.getJSONArray("v4");
mJAv5 = mJObj.getJSONArray("v5");
mJAv6 = mJObj.getJSONArray("v6");
mJAIndex = 0;
} catch (JSONException e) {
e.printStackTrace();
}
:
}
(악곡에 대응하는 데이터, 파일 읽기, 파일에서 읽는 문자열을 json 데이터에 저장하는 부분을 사랑해 주세요)
JSON 데이터 읽기에 관해서는 이쪽 사이트 등을 참고하였습니다.
public class MusicPlayerService extends Service implements OnCompletionListener,
:
private int mJAIndex = 0;
private JSONArray mJAtime;
private JSONArray mJAv0;
private JSONArray mJAv1;
private JSONArray mJAv2;
private JSONArray mJAv3;
private JSONArray mJAv4;
private JSONArray mJAv5;
private JSONArray mJAv6;
:
public void onPrepared(MediaPlayer player) {
readFile();
:
}
private void readFile() {
:
try {
mJObj = new JSONObject(json_data);
mJAtime = mJObj.getJSONArray("Time");
mJAv0 = mJObj.getJSONArray("v0");
mJAv1 = mJObj.getJSONArray("v1");
mJAv2 = mJObj.getJSONArray("v2");
mJAv3 = mJObj.getJSONArray("v3");
mJAv4 = mJObj.getJSONArray("v4");
mJAv5 = mJObj.getJSONArray("v5");
mJAv6 = mJObj.getJSONArray("v6");
mJAIndex = 0;
} catch (JSONException e) {
e.printStackTrace();
}
:
}
노래 모드 알림
음악 서비스는 정기적으로 중단되며 intent로 그 시간에 알리는 노래 모드를 사용합니다.
MusicPlayerService.java
public class MusicPlayerService extends Service implements OnCompletionListener,
:
private Handler mHandler = new Handler();
:
public void onCreate() {
:
mTimer.schedule(new TimerTask() {
@Override
public void run() {
mHandler.post( new Runnable() {
public void run() {
sendPlayerState();
}
});
}
}, 100, 100);
:
}
우선 음악 플레이어 서비스에서 mHandler라는 이름의 타이머를 100ms마다 등록한다.다음은 타이머가 부른sendPlayState()로 노래 도형을 알립니다.
MusicPlayerService.java
public class MusicPlayerService extends Service implements OnCompletionListener,
:
public static final String ACTION_STATE_CHANGED = "com.example.android.remotecontrol.ACTION_STATE_CHANGED";
:
private void sendPlayerState() {
:
Intent intent = new Intent(ACTION_STATE_CHANGED);
t0 = mPlayer.getCurrentPosition();
intent.putExtra("currentPosition", t0);
try {
t1 = mJAtime.getLong(mJAIndex);
} catch (JSONException e) {
e.printStackTrace();
}
if (t1 < t0) {
try {
intent.putExtra("Update", true);
intent.putExtra("v0", mJAv0.getInt(mJAIndex));
intent.putExtra("v1", mJAv1.getInt(mJAIndex));
intent.putExtra("v2", mJAv2.getInt(mJAIndex));
intent.putExtra("v3", mJAv3.getInt(mJAIndex));
intent.putExtra("v4", mJAv4.getInt(mJAIndex));
intent.putExtra("v5", mJAv5.getInt(mJAIndex));
intent.putExtra("v6", mJAv6.getInt(mJAIndex));
} catch (JSONException e) {
e.printStackTrace();
}
mJAIndex += 1;
}
sendBroadcast(intent);
}
만약 악곡의 재생 위치가 패턴 변화 시간을 초과하면 intent에 정보를 추가하여 보냅니다.먼저, t0=mPlayer.getCurrentPosition()에서 타이머가 중단되었을 때의 재현 위치를 가져와 t0에 저장합니다.
(mPlayer는 재생 중인 Media Player 인스턴스)
그런 다음 t1에 mJAIndex의 패턴 변경 사항을 저장할 때
't1
그런 다음 mJAIndex에 1을 더하여 다음 시기를 가리킵니다.
마지막으로 "sendBroadcat(intent)"에 inetnt를 보냅니다.
Reference
이 문제에 관하여(안드로이드로 음악 재생을 해보는 앱.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/maki02/items/a4ef82b682e7190357c4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)