1. 程式人生 > >android----極其簡易的音樂播放器(service的使用)

android----極其簡易的音樂播放器(service的使用)

俱樂部的作業已經拖了一週了,實在不好意思再不弄了。。。前天晚上開了個頭,總是因為資源太大執行不了,導致一直沒法繼續編下去。。今天偶然發現居然刪掉了之前工程裡的音樂資源就又能加進去一個音樂了~為了避免再次執行不了,我就加了兩個音樂,來回切換,也算能夠完成基本要求啦~表示資源太大光等待它安裝就要好久好久。。。人生真的是一個漫長的等待過程啊。。。下面說一說遇到的問題吧~

1、首先的工作就是PS了。。表示自從學了點PS之後,似乎就有了強迫症。。。不管程式編的怎麼樣。。。介面可絕對不能醜。。不然看著太沒有心情了。。。女生的通病吧。。。剛開始做的是橫屏的~因為漂亮的圖圖都是橫的~但是後來就有問題了。。音樂列表顯然是豎的好看些,不能讓使用者橫著看個開始畫面再把螢幕豎過來吧。。於是只好捨棄剛開始的PS成果。。把它轉成豎的。。圖如下:

轉換前:


轉化後:


還算不錯吧~當時想把橫圖變成豎圖想了各種辦法。。在網上各種搜。。還好背景顏色比較單一。。我截了一點上面的雲複製之後,契合性特別的差。。搜了合併圖的方法也都不滿意。。最終萬般悲痛之際。。我們的午昊大神現身了~!聽了我的問題。。用了一秒鐘的時間。。他。。搞定了。。讓我極其之慚愧啊。。找資料就找了那麼久。。居然人家這麼快就搞定了。。總結一句:找資料不如找午昊。。嘿嘿~他用的方法很簡單,選中上面的一塊拉伸(ctrl+T)就OK了~ orz....

2、然後我就想給背景加個進入的動畫(Question time~!)~但是查了資料也不知道怎麼加。。畢竟我背景是在xml中配置的,也沒有這個物件,是在無從下手。。最終直接把背景弄成ImageView了~說到這個ImaginView啊。。我還是挺喜歡的~剛開始播放什麼的按鍵用的是ImageButton,但是layout_width之類的屬性調整的是Button的大小,那個圖就是本來的大小了。。巨大無比啊有木有!都不完整。。後來我就改成ImageView了。。不過按的時候就沒有橙色的反饋了。。所以還是想知道怎麼調整ImageButton裡面的圖片的大小啊。。(Quesion time again~!)

我上次使用PS直接把圖弄小了。。好低端。。。

3、Intent的問題。。由於把初始畫面弄了一個Imageview並且是由透明淡出的效果,之後想直接切換到第二個Activity,但是我直接在動畫效果之後寫了startIntent就會初始畫面就是第二個Activity。。(Qustion time...)不知道怎麼回事。。我就給ImageView加了onClick事件。。

4、後來在播放音樂的時候,我希望一個圖片能夠始終是擺動的動態效果。。(Q..)但是在anim裡面的xml檔案中寫動畫效果就不知道怎麼寫了。。rotate只能設定初始和結束的角度,我想設定兩個rotate交替進行也不行。。後來就讓旋轉一圈好了。。效果都差不多。。但是著實不知道如何擺動啊。。。

5、每次執行都要把之前的那個程式刪掉啊有木有!自己手機記憶體本來就小模擬器也這麼坑爹啊!我還要每次刪除一下才能再次執行啊!表示每次程式設計光搞這種非重點(等待模擬器之類。。)就要佔用大部分時間。。好浪費時間啊。。。

6、後來播放的時候不能暫停,用log日誌輸出了一堆資訊也確實呼叫pause了。。在那搞了半天。。結果是因為我每次點選按鈕都會呼叫這個service的onStart,也就會在Create一次。。就會出錯了。。所以設定了一個標誌變數,只有第一次獲得資源的時候才Create,暫停再播放之類的就不再呼叫create了。。。

說完問題。。我再說一下這次的思路吧。。首先是一個很簡單的進入頁面,加入了動畫效果,只有一個ImageView,點選的時候進入音樂的列表ListView可以選擇播放哪首歌曲。。根據選擇的id不同,向intent中putextra不同的鍵值對,然後傳給播放音樂的那個activity。。在音樂播放的activity裡面根據intent傳過來的值,採用不同的佈局,其實就是歌手的圖片不同。。然後在得到這個intent並往裡面putextra點了哪個按鈕(播放還是暫停之類的。。)的資訊,傳給service。。service判斷之後在呼叫不同的方法對mediaplayer的物件進行操作。。。同時intent中還有listview中傳過來的歌手的資訊(從第一個intent裡面獲取的。。本來想就用之前的那個intent但是不行。。那個就是從listview到播放的介面傳遞的intent,還不讓我繼續用唉。。),就能獲取是哪個音樂資源了。。。

下面上圖和程式碼~~佈局檔案的程式碼就不傳了。。那個listview其實還是有點麻煩的。。還要給它寫一個佈局。。顯示出來會比較好看~~



動態效果實在截不出來。。也就是旋轉一圈。。沒什麼好看的。。截了個過程中的。。。


貼一個播放列表那個activity和service的程式碼吧~~這兩個比較關鍵~~

package com.MusicPlayer;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class MusicPlay extends Activity {

	private Animation anim;
	private ImageView pic;
	private ImageView last;
	private ImageView next;
	private ImageView pause;
	private ImageView play;
	private ImageView stop;
	private Intent intent = new Intent();
	private OnClickListener playListener = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			intent.putExtra("choice", "play");
			intent.setClass(MusicPlay.this, MusicService.class);
			startService(intent);
		}
	};
	private OnClickListener pauseListener = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			intent.putExtra("choice", "pause");
			intent.setClass(MusicPlay.this, MusicService.class);
			startService(intent);
		}
	};
	private OnClickListener stopListener = new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			intent.putExtra("choice", "stop");
			intent.setClass(MusicPlay.this, MusicService.class);
			startService(intent);
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Intent oldIntent = getIntent();
		String singer = oldIntent.getStringExtra("name");
		if(singer.equals("taylor"))
		{
			setContentView(R.layout.taylor);
			pic = (ImageView) findViewById(R.id.taylor);
			intent.putExtra("singer", "taylor");
		}
		else if(singer.equals("dingdang"))
		{
			setContentView(R.layout.dingdang);
			pic = (ImageView) findViewById(R.id.dingdang);
			intent.putExtra("singer", "dingdang");
		}
		 anim = AnimationUtils.loadAnimation(this, R.anim.picture);
		 pic.startAnimation(anim);
		 last = (ImageView) findViewById(R.id.last);
		 next = (ImageView)findViewById(R.id.next);
		 pause = (ImageView)findViewById(R.id.pause);
		 stop = (ImageView)findViewById(R.id.stop);
		 play = (ImageView)findViewById(R.id.play);
		 play.setOnClickListener(playListener);
		 pause.setOnClickListener(pauseListener);
		 stop.setOnClickListener(stopListener);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		menu.add("退出");
		return super.onCreateOptionsMenu(menu);
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		if(item.getItemId()==0)
		{
			stopService(intent);
			finish();
		}
		return super.onOptionsItemSelected(item);
	}
}

package com.MusicPlayer;


import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

public class MusicService extends Service {

	boolean flag = true;
	private MediaPlayer player;
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		Log.v("tag", "on bind");
		return null;
	}
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		Log.v("tag", "on create");
	}
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.v("tag", "on destroy");
	}
	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		super.onStart(intent, startId);
		Log.v("tag", "on start");
		String choice = intent.getStringExtra("choice");
		String singer = intent.getStringExtra("singer");
		Log.v("choice", choice);
		if(singer.equals("taylor")&&flag)
		{
			Log.v("tag", "taylor");
			player = MediaPlayer.create(this, R.raw.jumpthenfall);
			flag = false;
		}
		else if(singer.equals("dingdang")&&flag)
		{
			Log.v("tag", "dingdang");
			player = MediaPlayer.create(this, R.raw.caibutou);
			flag = false;
		}
			if(choice.equals("play"))
		{
			player.start();
		}
		else if(choice.equals("pause"))
		{
			Log.v("tag", "pause");
			player.pause();
		}
		else if(choice.equals("stop"))
		{
			Log.v("tag", "choice");
			player.stop();
			player.release();
			flag = true;
		}
	}
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.v("tag", "on start command");
		return super.onStartCommand(intent, flags, startId);
	}
}

最後。。表示。。我沒有弄歌曲間的切換。。就放上去了兩首。。不想弄了。。其實就是給按鈕增加監聽事件的時候在intent裡面傳一個標記就行,或者剛開始從listview那個activity傳的時候就傳id的值,next,last就獲取id的值之後++或者--,再傳給service就行了~就是傳來傳去的。。現在好睏想睡覺了。。感覺這些做的小東西會了就好~就是學點不同的東西嘛~沒必要再做體力活了~以後開發專案有的是體力活啊~~洗漱去啦~\(≧▽≦)/~~~