Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android音樂播放器;activity生命周期;模擬器用快照(snapshot)沒聲音;win7要用管理員身份運行adt,才能打開模擬器sdcard;

android音樂播放器;activity生命周期;模擬器用快照(snapshot)沒聲音;win7要用管理員身份運行adt,才能打開模擬器sdcard;

編輯:關於Android編程

onCreat到onDestroy是整個activity生命周期(界面生成代碼放在oncreate,放其他循環占內存);onStart到onStop是所有在顯示界面的周期(onRestart完成循環,例如:返回列表信息時應該更新內容);onResume到onPause一次顯示在界面的周期;

播放歌曲時,進度條要動,而且下面的值也變化,所以用多線程,

照完照片存sd卡然後添加到頭像,布局xml寫在前面的是放在最下面(存在布滿整個界面的情況下)

可以在官網,也可以在下載下來的sdk中查看api。D:\Android4.0\adt-bundle-windows-x86-20130219\sdk\docs\reference

主activity代碼

package com.kane.musicplayer;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import com.kane.musicplayer.dbc.SqliteConnection;
import com.kane.musicplayer.util.MusicDAOUtils;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.R.integer;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {
private MediaPlayer player;
//上一首,播放,下一首
private Button preBtn,nextBtn,playBtn;
//歌曲名稱,顯示時間/歌曲總時間
private TextView songName,timeText;
private SeekBar seekBar;

//總時長的文字
private String allTimeText;
//加入子線程的通道
private Handler handler;
//取得所有播放歌曲的集合
private List> allValues;

private SqliteConnection sc;
private String filePath="/mnt/sdcard/Music/a.mp3";
private String name="FLY ME TO THE MOOM";
//當前播放歌曲索引
private int playIndex=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//建立數據庫連接
sc=new SqliteConnection(this);
//讀取數據庫中的保存而定音樂播放列表
allValues=MusicDAOUtils.listdata(sc.getReadableDatabase());
// 初始化所有組件
preBtn = (Button) findViewById(R.id.pre_btn);
playBtn = (Button) findViewById(R.id.play_btn);
nextBtn = (Button) findViewById(R.id.next_btn);
songName = (TextView) findViewById(R.id.song_name);
timeText = (TextView) findViewById(R.id.time_text);
seekBar = (SeekBar) findViewById(R.id.seekbar);
/**
* 這裡歌曲在播放,同時進度條和時間進度應該在走,涉及多線程
*/
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
//進度條前進的位置
seekBar.setProgress(player.getCurrentPosition());
timeText.setText(changeToTimeFormat(player.getCurrentPosition())+"/"+
allTimeText);
}

};
//初始化第一首歌曲
setPlayMusic();

//設置player.setLooping(false);不循環
// player.setVolume(1.0f, 1.0f);左右聲道音量

//播放
playBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (player.isPlaying()) {
player.pause();
playBtn.setBackgroundResource(R.drawable.bt_widget_play_nor);
}
else {//暫停狀態
player.start();
playBtn.setBackgroundResource(R.drawable.bt_widget_pause_nor);
}
}
});

//拖動,並改變播放位置,音樂動。進度條和顯示時間一起走
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

//拖到一點,放手
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// 根據當前SeekBar的位置,讓播放器從這個位置開始播放
player.seekTo(seekBar.getProgress());
//重新播放音樂
player.start();

}

//在拖動中
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//暫停播放音樂
if (player.isPlaying()) {
player.pause();
}
}

/**
* 進度條改變,fromUser可以是某個人操作,也可以是系統
* progress 是當前位置
*/
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// 時間跟著進度條一起走, 前提是用戶改變的時候.
if (fromUser) {
timeText.setText(changeToTimeFormat(progress)+"/"
+allTimeText);
}
}
});
// 進行歌曲的切換
preBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (playIndex == 0) {
Toast.makeText(MainActivity.this, "當前已經是第一首歌,無法切換上一首!",
Toast.LENGTH_LONG).show();
} else {
playIndex--;
setPlayMusic();
playBtn.performClick();//播放按鈕的點擊操作即播放
}
}
});


nextBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (playIndex == allValues.size() - 1) {
Toast.makeText(MainActivity.this, "當前已經是最後一首歌,無法切換下一首!",
Toast.LENGTH_LONG).show();
} else {
playIndex++;
setPlayMusic();
playBtn.performClick();//播放按鈕的點擊操作即播放
}
}
});

//加入一個子線程,控制拖動條的自動移動,上面寫的監聽事件可以是主線程的也可以是子線程的
//子線程要改變界面要用到handler
Thread t=new Thread(){
public void run() {
try {
while (true) {
sleep(1000);//間隔1秒查詢一次是否移動
//如果已經播放,就移動拖動條,否則不用移動
if (player.isPlaying()) {
handler.sendEmptyMessage(0);
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
};
t.start();
}
/**
* 進行音樂初始化,初始狀態是停止
*/
public void setPlayMusic() {
Map map=allValues.get(playIndex);
filePath=map.get("filePath").toString();
name=map.get("songName").toString();
if(player!=null){
if (player.isPlaying()) {
player.stop();
}
player.release();//先停止,後釋放內存
}
//先建立player對象
player=new MediaPlayer();

try {
//設置數據來源。可以在官網,也可以在下載下來的sdk中查看api。D:\Android4.0\adt-bundle-windows-x86-20130219\sdk\docs\reference
// player = MediaPlayer.create(this, R.raw.a);放在項目內的,可以不用prepare
player.setDataSource(this, Uri.fromFile(new File(filePath)));

songName.setText(name);
//准備
player.prepare();
//獲取整個音頻的長度,ms單位
allTimeText=changeToTimeFormat(player.getDuration());
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(MainActivity.this, "播放出現問題, 請與needkane聯系",
Toast.LENGTH_SHORT).show();
}
//設置最大值
seekBar.setMax(player.getDuration());
//顯示初始進來的 播放時間/總時間,初始狀態是停止
timeText.setText("00:00:00/"+allTimeText);
}
/**
* 將ms轉成hh:mm:ss的格式
* @param ms
* @return
*/
public String changeToTimeFormat(int ms) {
int s=ms/1000;
int min=s/60;
s=s%60;//多出的秒數
int hour=min/60;
min=min%60;

StringBuilder sb=new StringBuilder();
if (hour<10) {//如果hour小於10,前面應該加0
sb.append("0");
}
sb.append(hour+":");
if (min<10) {
sb.append("0");
}
sb.append(min+":");
if (s<10) {
sb.append("0");
}
sb.append(s);
return sb.toString();
}
@Override
protected void onDestroy() {
//退出時釋放播放的音樂
try {
if (player!=null) {
if (player.isPlaying()) {
player.stop();
}
player.release();
}
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.onDestroy();
}

}

數據庫連接和操作代碼

package com.kane.musicplayer.dbc;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


public class SqliteConnection extends SQLiteOpenHelper {


private static String DBNAME="music.db";
public SqliteConnection(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
public SqliteConnection(Context ctx) {
super(ctx, DBNAME, null, 1);
}


@Override
public void onCreate(SQLiteDatabase db) {
String sql="CREATE TABLE music(" +
"filepath text primary key," +
"songname text " +
")";
db.execSQL(sql);
//這裡的音頻我們手動插入的,實際情況應該是下載到sdcard
sql = "INSERT INTO music (filepath,songname) VALUES ('/mnt/sdcard/Music/a.mp3','Fly me to the moon')" ;
db.execSQL(sql);
sql = "INSERT INTO music (filepath,songname) VALUES ('/mnt/sdcard/Music/b.mp3','時間都去哪兒了')" ;
db.execSQL(sql);
sql = "INSERT INTO music (filepath,songname) VALUES ('/mnt/sdcard/Music/c.mp3','卷珠簾')" ;
db.execSQL(sql);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub


}


}


package com.kane.musicplayer.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class MusicDAOUtils {
public static List> listdata(SQLiteDatabase sc) {
String sql="SELECT filepath,songname FROM music";
List> allValues = new ArrayList>();
Cursor c=sc.rawQuery(sql,null);//rawQuery裡面執行sql語句
c.moveToFirst();//手動指向第一個
while (!c.isAfterLast()) {//當不是最後一個的時候
Map map=new HashMap();
map.put("filePath",c.getString(0));
map.put("songName", c.getString(1));
allValues.add(map);
c.moveToNext();//手動指向下一個
}
c.close();
return allValues;
}
}


界面代碼

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:orientation="vertical" >


android:id="@+id/song_name"
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="center"
android:layout_weight="1"
android:textColor="#ffffff"
android:textSize="16sp" />


android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3" />


android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.5" />


android:id="@+id/time_text"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center"
android:layout_weight="0.5"
android:textColor="#ffffff"
android:textSize="12sp" />


android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2.5" />


android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >


android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5" />


android:id="@+id/pre_btn"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_widget_prev_nor" />


android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />


android:id="@+id/play_btn"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1.5"
android:background="@drawable/bt_widget_play_nor" />


android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />


android:id="@+id/next_btn"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/bt_widget_next_nor" />


android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5" />




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved