編輯:關於android開發
<?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_horizontal"> <Button android:id="@+id/musicList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="#86B2F4" android:text="音樂文件列表" android:textColor="#fff" android:textSize="28sp"/> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/logo"/> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <ImageButton android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/stop"/> <ImageButton android:id="@+id/pre" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/pree"/> <ImageButton android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/play"/> <ImageButton android:id="@+id/next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/next"/> </LinearLayout> </LinearLayout>
/** * Created by 劉楠 on 2016-03-05 19:39. * 文件過濾器工具類, * 用於過濾指定後綴的文件 */ public class MusicFileNameFilter implements FilenameFilter { private String type; public MusicFileNameFilter(String type) { this.type = type; } @Override public boolean accept(File dir, String filename) { return filename.endsWith(type); } }
/** * Created by 劉楠 on 2016-03-05 20:41. */ public interface IMusicPlayerService { public void callplay(String path); ; public void callStop(); public boolean callIsPlaying(); public int callGetgetDuration(); public int callGetgetCurrentDuration(); public boolean callMediaIsNull(); public void callChanageSeek(int position); public void callPause(); } 4. service /** * Created by 劉楠 on 2016-03-05 20:32. * * Servie音樂播放 */ public class MusicPlayerService extends Service { private MediaPlayer mediaPlayer; private MusicPlayerBinder musicPlayerBinder = new MusicPlayerBinder(); private class MusicPlayerBinder extends Binder implements IMusicPlayerService { public void callplay(String path) { play(path); } @Override public void callStop() { stop(); } @Override public boolean callIsPlaying() { return isPlaying(); } @Override public int callGetgetDuration() { return getgetDuration(); } @Override public int callGetgetCurrentDuration() { return getCurrentDuration(); } @Override public boolean callMediaIsNull() { return mediaIsNull(); } @Override public void callChanageSeek(int position) { chanageSeek(position); } @Override public void callPause() { pause(); } } @Nullable @Override public IBinder onBind(Intent intent) { return musicPlayerBinder; } /** * 初始化 * @param path */ private void init(String path) { if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); reset(path); }else{ reset(path); } } /** * 資源重置 * @param path */ private void reset(String path) { try { mediaPlayer.reset(); mediaPlayer.setDataSource(path); mediaPlayer.prepare(); mediaPlayer.setLooping(true); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } /** * 播放 * @param path */ private void play(String path) { /* if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } else if (mediaPlayer != null&&!mediaPlayer.isPlaying()) { mediaPlayer.start(); } else { init(path); }*/ init(path); } /** * 是不是在播放 * @return */ private boolean isPlaying(){ if(mediaPlayer!=null) { return mediaPlayer.isPlaying(); } return false; } /** * 獲取總的進度 * @return */ private int getgetDuration(){ return mediaPlayer.getDuration(); } /** * 獲取當前進度 * @return */ private int getCurrentDuration(){ return mediaPlayer.getCurrentPosition(); } /** * 暫停 */ private void pause(){ if(mediaPlayer!=null&&mediaPlayer.isPlaying()){ mediaPlayer.pause(); }else if(mediaPlayer!=null&&!mediaPlayer.isPlaying()){ mediaPlayer.start(); } } /** * 停止 */ private void stop(){ if(mediaPlayer!=null){ mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer=null; } } /** * 判斷當前是不是NULL * @return */ private boolean mediaIsNull(){ return mediaPlayer==null; } private void chanageSeek(int position){ mediaPlayer.seekTo(position); mediaPlayer.start(); } }
public class MainActivity extends AppCompatActivity implements View.OnClickListener { //音樂文件的目錄 private static final String PATH = Environment.getExternalStorageDirectory() + "/Music/"; private static final String TAG = "MainActivity"; //文件路徑 private ArrayList<String> fileList = new ArrayList<String>(); //文件名 private ArrayList<String> fileNameList = new ArrayList<String>(); /* 進度條 */ private SeekBar seekBar; /* 音樂文件列表 */ private Button musicList; /* 音樂控制按鍵 */ private ImageButton stop; private ImageButton pre; private ImageButton play; private ImageButton next; //單首音樂的路徑 private String musicPath; private IMusicPlayerService mPlayerService; private MusicPlayerServiceConnection mConn; private boolean mBound =false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* 初始化 */ seekBar = (SeekBar) findViewById(R.id.seekBar); musicList = (Button) findViewById(R.id.musicList); stop = (ImageButton) findViewById(R.id.stop); pre = (ImageButton) findViewById(R.id.pre); ; play = (ImageButton) findViewById(R.id.play); ; next = (ImageButton) findViewById(R.id.next); ; File file = new File(PATH); //獲取文件列表 File[] arrs = file.listFiles(new MusicFileNameFilter(".mp3")); for (File f : arrs) { //添加全路徑到文件列表 fileList.add(f.getAbsolutePath()); //添加文件表到文件列表 fileNameList.add(f.getName()); } /* 設置監聽器 */ musicList.setOnClickListener(this); stop.setOnClickListener(this); pre.setOnClickListener(this); play.setOnClickListener(this); next.setOnClickListener(this); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } //拖動進度條,改變播放進度 @Override public void onStopTrackingTouch(SeekBar seekBar) { mPlayerService.callChanageSeek(seekBar.getProgress()); } }); } @Override protected void onStart() { super.onStart(); if(mConn==null){ mConn= new MusicPlayerServiceConnection(); } Intent intent = new Intent(this,MusicPlayerService.class); mBound = bindService(intent, mConn, BIND_AUTO_CREATE); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.musicList: showList(); break; case R.id.stop: stop(); break; case R.id.pre: pre(); break; case R.id.play: play(); break; case R.id.next: next(); break; } } /* 下一首 */ private void next() { int index = fileList.indexOf(musicPath); if(index>=fileList.size()){ index=0; } mPlayerService.callplay(fileList.get(index+1)); } /* 播放 */ private void play() { Log.d(TAG, "mBound" + mBound); boolean isNull = mPlayerService.callMediaIsNull(); if(isNull) { mPlayerService.callplay(musicPath); }else{ mPlayerService.callPause(); } if(mPlayerService.callIsPlaying()){ play.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.pause)); }else{ play.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.play)); } //更新進度 new Thread(){ boolean isFinished=mPlayerService.callIsPlaying(); @Override public void run() { if(isFinished) { while (isFinished) { SystemClock.sleep(200); int currentDuration = mPlayerService.callGetgetCurrentDuration(); int duration = mPlayerService.callGetgetDuration(); seekBar.setMax(duration); seekBar.setProgress(currentDuration); if (currentDuration >= duration) { isFinished = false; } } } } }.start(); } /** * 上一首 */ private void pre() { int index = fileList.indexOf(musicPath); if(index<=0){ index=fileList.size()-1; } mPlayerService.callplay(fileList.get(index-1)); } /** * 停止播放 */ private void stop() { mPlayerService.callStop(); } /** * 顯示音樂列表 */ private void showList() { Intent intent = new Intent(this,MusicListActivity.class); //intent.putStringArrayListExtra("filelist",fileList); intent.putStringArrayListExtra("filenamelist",fileNameList); startActivityForResult(intent,100); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data==null){ Toast.makeText(MainActivity.this, "沒有結果", Toast.LENGTH_SHORT).show(); return; } //獲取下標 int position = data.getIntExtra("position", 0); //設置音樂路徑 musicPath = fileList.get(position); // play(); Log.d(TAG,musicPath); } private class MusicPlayerServiceConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { mPlayerService = (IMusicPlayerService) service; } @Override public void onServiceDisconnected(ComponentName name) { if(mConn!=null){ mConn =null; } } } @Override protected void onStop() { super.onStop(); if(mConn!=null){ unbindService(mConn); mConn=null; mPlayerService=null; } } @Override protected void onDestroy() { super.onDestroy(); if(mConn!=null){ unbindService(mConn); mConn=null; mPlayerService=null; } } }
linux中fcntl()、lockf、flock的區別fcntl()、lockf、flock的區別——lvyilong316這三個函數的作用都是給文件加鎖,那它們有什麼
Android反編譯和二次打包實戰 作為Android開發者,工作中少不了要反編譯別人的apk,當然主要目的還是為了學習到更多,取彼之長,補己之短。今天就來總結一下A
Android 下拉列表框、文本框、菜單,android列表框1、下拉列表框(Spinner) 項目布局 <RelativeLayout xmlns:androi
Android快樂貪吃蛇游戲實戰項目開發教程-04虛擬方向鍵(三)三角形按鈕效果,android-04該系列教程概述與目錄:http://www.cnblogs.com/