public class MainActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; private int position = 0; // 현재 재생곡 위치 private String currentPath;
private ProgressDialog progressDialog; public SharedPreferences settings; ProgressDialog mProgressDialog;
RecyclerView audiolistView; // 리스트뷰 (ListView 대신 RecyclerView) private ArrayList<FileList_Item> fileList = new ArrayList<>(); // 스트리밍 전체 리스트 RecyclerView.Adapter listViewAdapter; // ListViewAdapter 대신 RecyclerView.Adapter RecyclerView.LayoutManager layoutManager;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this.getBaseContext(); backPressHandler = new BackPressHandler(this); // 뒤로 가기 버튼 이벤트
// 화면 꺼짐 방지 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// Adapter에 추가 데이터를 저장하기 위한 ArrayList audiolistView = (RecyclerView) findViewById(R.id.recyclerview); audiolistView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); audiolistView.setLayoutManager(layoutManager);
listViewAdapter = new ListViewAdapter(this,fileList); // Adapter 생성 audiolistView.setAdapter(listViewAdapter); // 어댑터를 리스트뷰에 세팅
// 스트리밍 재생 리스트 가져오기 getStreamingAudioList(""); }
private void getStreamingAudioList(String audioPath){ // 서버 데이터 가져오기 Uri.Builder builder = new Uri.Builder() .appendQueryParameter("audioPath", audioPath); String postParams = builder.build().getEncodedQuery(); new getJSONData().execute(Value.IPADDRESS + "/getFileList.php",postParams); }
// 파일 리스트 추가를 위한 메소드 public void FileAllList(String fileName, String filePath, String curPath, String isFile){ FileList_Item item = new FileList_Item(); item.setFileName(fileName); item.setFilePath(filePath); item.setCurPath(curPath); item.setIsFile(isFile); fileList.add(item); }
public class ViewHolder extends RecyclerView.ViewHolder { public ImageView mIcon; public TextView mfileName; public String mfilePath; public String mcurPath; public String isFile;
public ViewHolder(View itemView) { super(itemView); // 화면에 표시될 View 로부터 위젯에 대한 참조 획득 mIcon = (ImageView) itemView.findViewById(R.id.iv_fileType); mfileName = (TextView) itemView.findViewById(R.id.tv_fileName);
public void setFileListItem(FileList_Item item, final int position) { fileItem = item; mfileName.setText(fileItem.getFileName()); isFile = fileItem.getIsFile(); mcurPath = fileItem.getCurPath(); if(isFile.equals("2")) { mIcon.setImageResource(R.drawable.upper_folder); // 상위 폴더 } else if(isFile.equals("1")){ mIcon.setImageResource(R.drawable.music_icon) ; // 재생 음악 } else { mIcon.setImageResource(R.drawable.folder_icon) ; // 서브 폴더 } } }
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 새로운 뷰를 만든다. View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.file_item,parent,false); ViewHolder viewHolder = new ViewHolder(itemView); return viewHolder; }
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { fileItem = audioList.get(position); ((ViewHolder) holder).setFileListItem(fileItem,position); }
@Override public int getItemCount() { return audioList.size(); // 데이터 개수 리턴 } }
public void playMusic(FileList_Item item) { // HTTP 스트리밍을 통한 원격의 URL에서 재생 String uri = Value.IPADDRESS + item.getFilePath(); try { if(mediaPlayer != null && mediaPlayer.isPlaying()){ mediaPlayer.stop(); mediaPlayer.reset(); }
mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(uri); mediaPlayer.prepareAsync(); mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); } }); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { if(position + 1 < fileList.size()) { position++; playMusic(fileList.get(position)); // 선택한 곡 이후 연속 재생 목적 } else { Log.e("Streaming","스트리밍 종료"); position = 0; mediaPlayer.stop(); mediaPlayer.reset(); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); acquireCPUWakeLock(mContext); releaseCpuLock(); } } });
// 서버 정보를 파싱하기 위한 변수 선언 private static final String TAG_RESULTS="result"; private static final String TAG_fileNAME = "fileName"; private static final String TAG_filePATH ="filePath"; private static final String TAG_curPATH ="curPath"; private static final String TAG_isFile ="isFile"; JSONArray audiofiles = null;
fileList.clear(); // 서버에서 가져온 데이터 초기화 if(!TextUtils.isEmpty(currentPath)){ int i = currentPath.lastIndexOf("/"); FileAllList("상위폴더", currentPath, currentPath.substring(0,i), "2"); } for(int i = 0; i < audiofiles.length(); i++){ JSONObject c = audiofiles.getJSONObject(i); final String fileName = c.getString(TAG_fileNAME); final String filePath = c.getString(TAG_filePATH); final String curPath = c.getString(TAG_curPATH); final String isFile = c.getString(TAG_isFile);
// 서버에서 가져온 데이터 저장 FileAllList(fileName, filePath, curPath, isFile); }
runOnUiThread(new Runnable() { // runOnUiThread()를 호출하여 실시간 갱신한다. @Override public void run() { // 갱신된 데이터 내역을 어댑터에 알려줌 listViewAdapter.notifyDataSetChanged(); } }); } catch (JSONException e) { e.printStackTrace(); }
}
@SuppressLint("Wakelock") private void acquireCPUWakeLock(Context context) { // 잠든 화면 깨우기 if (wakeLock != null) { return; }
// serverURL : JSON 요청을 받는 서버의 URL // postParams : POST 방식으로 전달될 입력 데이터 // 반환 데이터 : 서버에서 전달된 JSON 데이터 public static String getJson(String serverUrl, String postParams) throws Exception {