目錄
一 需求分析... 1
1.1用例分析... 1
二 系統設計... 2
三 系統測試... 3
3.1 測試用例... 3
四 系統實現... 4
附件... 11
一 課設題目... 11
二 技術說明... 11
三 UML類圖... 12
四 代碼... 12
4.1 清單文件... 12
4.2 布局文件... 13
4.2.2 源文件... 14
4.3 Java代碼... 22
一 需求分析
智能手機需要音樂播放器才能播放手機內的音頻文件,本軟件具備音樂播放器的播放歌曲、歌曲列表、拖動進度等基本功能,同時本播放器界面簡潔美觀,操作簡單便捷。
1.1用例分析
(1) 注冊
擁有賬號才能登錄。
(2) 登錄
輸入注冊的賬號和密碼登錄。
(3) 播放器主頁
進入播放頁面點擊列表中的歌曲或者點擊播放按鈕都可以實現播放。
二 系統設計
音樂播放器由歡迎頁面、注冊頁面、登錄頁面、播放器主頁、退出登錄頁面組成。
歡迎頁面由一個haunying.xml設置background加一個button組成,在haunying.java中用intent跳轉登錄頁面(運用SharedPreferneces存儲在下次打開登錄頁面可以顯示保存的賬號和密碼)。
登錄頁面由activity_main.xml設置TextView注冊,在MainActivity.java設置跳轉注冊頁面。
注冊頁面由zhuce.xml設置的Button注冊按鈕,在MainActivity2.java中設置傳回注冊的賬號,然后在登錄頁面直接顯示傳回的賬號,輸入正確密碼即可登錄。
播放器主頁由zhuactivity_main.xml設置了四個Button設置上一曲、播放/暫停、下一曲、退出登錄,兩個ListView設置當前時間、全部時間,一個Seekbar設置播放進度條。在ZHUMainActivity.java中調用自定義MyAdaper.java方法在Music.Utils.java用SQLite獲取到本地數據庫的歌曲,然后填充到ListView中,利用安卓MediaPlayer實現歌曲的播放/暫停、上一曲、下一曲的切換。
退出登錄頁面由exittis.xml設計自定義對話框,在exittis.java設置退出。
三 系統測試
3.1 測試用例
四 系統實現
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et_account; //賬號輸入框
private EditText et_password; //密碼輸入框
private Button btn_login; //登錄按鈕
private TextView textView; //注冊按鈕
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//通過SharedPreferences方法獲取賬號密碼
Map<String,String> userInfo=Password.getUserInfo(this);
if (userInfo!=null){
//將獲取的賬號顯示到界面上
et_account.setText(userInfo.get("account"));
//將獲取的密碼顯示到界面上
et_password.setText(userInfo.get("password"));
}
}
private void initView(){
et_account=(EditText)findViewById(R.id.et_number);
et_password=(EditText)findViewById(R.id.et_password);
btn_login=(Button)findViewById(R.id.btn_login);
textView=(TextView)findViewById(R.id.textview);
btn_login.setOnClickListener(this);
}
public void onClick(View view){
switch (view.getId()){
case R.id.btn_login:
String ZH="admin";
String MM="admin";
//點擊登錄按鈕,獲取界面上的賬號和密碼
String account1=et_account.getText().toString().trim();
String password1=et_password.getText().toString();
//檢測賬號是否為空
if (TextUtils.isEmpty(account1)){
Toast.makeText(this,"請輸入賬號", Toast.LENGTH_LONG).show();
return;
}
//檢測密碼是否為空
if (TextUtils.isEmpty(password1)){
if (ZH.equals(account1)){
Toast.makeText(this,"請輸入密碼",Toast.LENGTH_LONG).show();}
else{
Toast.makeText(this,"無效賬號,請先注冊",Toast.LENGTH_SHORT).show();
}
return;
}
//檢測輸入的賬號和密碼是否正確
if (ZH.equals(account1)&&MM.equals(password1)){
Intent intent1=new Intent(MainActivity.this,ZHUMainActivity.class);
startActivity(intent1);
Toast.makeText(this,"登錄成功",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this,"賬號或密碼錯誤",Toast.LENGTH_SHORT).show();
}
break;
}
}
public void click(View view){
Intent intent=new Intent(MainActivity.this,MainActivity2.class);
startActivityForResult(intent,1);
}
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode,data);
if (requestCode==1&&resultCode==2){
String acquiredData=data.getStringExtra("zczh");
et_account.setText(acquiredData);
}
}
}
private Handler mHandler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
// 展示給進度條和當前時間
int progress = mediaPlayer.getCurrentPosition();
mSeekBar.setProgress(progress);
mCurrentTimeTv.setText(parseTime(progress));
// 繼續定時發送數據
updateProgress();
return true;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.zhuactivity_main);
mediaPlayer = new MediaPlayer();
mPreviousBtn= (Button) findViewById(R.id.mPreviousBtn);
mPlayBtn= (Button) findViewById(R.id.mPlayBtn);
mNextBtn= (Button) findViewById(R.id.mNextBtn);
bt1=(Button)findViewById(R.id.bt1);
mCurrentTimeTv= (TextView) findViewById(R.id.current_time_tv);
mTotalTimeTv= (TextView) findViewById(R.id.total_time_tv);
mSeekBar= (SeekBar) findViewById(R.id.seek_bar);
mSeekBar.setOnSeekBarChangeListener(this);
mPreviousBtn.setOnClickListener(this);
mPlayBtn.setOnClickListener(this);
mNextBtn.setOnClickListener(this);
initView();
}
/**
* 初始化view
*/
private void initView() {
mListView = (ListView) findViewById(R.id.main_listview);
list = new ArrayList<>();
//把掃描到的音樂賦值給list
list = MusicUtils.getMusicData(this);
adapter = new MyAdapter(this,list);
mListView.setAdapter(adapter);
mediaPlayer.setOnCompletionListener(this);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
mCurrentPosition=i;
changeMusic(mCurrentPosition);
}
});
}
@Override
public void onClick(View view) {
if (view.getId()==R.id.mPreviousBtn){//上一曲
changeMusic(--mCurrentPosition);
}else if (view.getId()==R.id.mPlayBtn){//暫停/播放
// 首次點擊播放按鈕,默認播放第0首
if (mediaPlayer==null){
changeMusic(0);
}else {
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else {
mediaPlayer.start();
}
}
}else if (view.getId()==R.id.mNextBtn){// 下一首
changeMusic(++mCurrentPosition);
}
}
// 基本數據類型和String在方法調用中傳遞的是值
// 其他數據類型在方法調用中傳遞的是引用
//切歌
private void changeMusic(int position){
if (position<0){
mCurrentPosition = position =list.size()-1;
}else if (position>list.size()-1){
mCurrentPosition = position=0;
}
if (mediaPlayer==null){
mediaPlayer=new MediaPlayer();
}
try {
// 切歌之前先重置,釋放掉之前的資源
mediaPlayer.reset();
// 設置播放源
mediaPlayer.setDataSource(list.get(position).path);
// 開始播放前的准備工作,加載多媒體資源,獲取相關信息
mediaPlayer.prepare();
// 開始播放
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
// 切歌時重置進度條並展示歌曲時長
mSeekBar.setProgress(0);
mSeekBar.setMax(mediaPlayer.getDuration());
mTotalTimeTv.setText(parseTime(mediaPlayer.getDuration()));
updateProgress();
}
private void updateProgress() {
// 使用Handler每間隔1s發送一次空消息,通知進度條更新
Message msg = Message.obtain();// 獲取一個現成的消息
// 使用MediaPlayer獲取當前播放時間除以總時間的進度
int progress = mediaPlayer.getCurrentPosition();
msg.arg1 = progress;
mHandler.sendMessageDelayed(msg, INTERNAL_TIME);
}
private String parseTime(int oldTime) {
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");// 時間格式
String newTime = sdf.format(new Date(oldTime));
return newTime;
}
private static final int INTERNAL_TIME = 1000;// 音樂進度間隔時間
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
// 當手停止拖拽進度條時執行該方法
// 獲取拖拽進度
// 將進度對應設置給MediaPlayer
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
mediaPlayer.seekTo(progress);
}
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
changeMusic(++mCurrentPosition);
}
public void clickk(View view) {
final exitthis dialog = new exitthis(ZHUMainActivity.this);
dialog.setTitle("提示");
dialog.setMessage("是否退出登錄?");
dialog.setNegtive("取消");
dialog.setPositive("確定");
dialog.setOnClickBottomListener(new exitthis.OnClickBottomListener() {
@Override
public void onPositiveClick() {
dialog.dismiss();
ZHUMainActivity.this.finish();
}
@Override
public void onNegtiveClick() {
dialog.dismiss();
}
});
dialog.show();
}
附件
一 課設題目
安卓音樂播放器
二 技術說明
- 歡迎頁、注冊頁、登錄頁、播放器主頁、退出登錄頁五個UI界面
- 實現登錄和注冊互跳轉,登錄頁跳轉到播放器頁,退出登陸頁跳轉登錄頁。
- 播放器使用mediaplayer實現播放/暫停、上一曲、下一曲
- 在登錄頁面使用SharedPreferences存儲實現記住賬號和密碼功能。
- 獲取的歌曲列表用ListView顯示。
- seekbar歌曲進度條的功能需求有兩部分:一是手動拖動進度條,使播放器從當前位置播放並更新當前時間,這里用進度條OnSeekBarChangeListener監聽;二是實現自動更新進度條進度,要求進度條進度與播放器進度一致,實現聯動,這里用線程或者廣播消息實現。
三 UML類圖
四 代碼
4.1 清單文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.itcase.dmtplayer">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".huanying">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity2">
</activity>
<activity android:name=".MainActivity">
</activity>
/activity>
<activity android:name=".ZHUMainActivity">
</activity>
</application>
</manifest>
4.2 布局文件
4.2.1截圖
4.2.2 源文件
歡迎頁面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/tt"
tools:context=".MainActivity">
<Button
android:id="@+id/huan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="450dp"
android:onClick="cllick"
android:text="立即體驗"
android:textSize="25sp"
android:layout_centerHorizontal="true"
/>
</RelativeLayout>
登錄頁面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/iv_head"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="160dp"
android:src="@drawable/tx"/>
<LinearLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/iv_head"
android:layout_margin="10dp"
android:background="#ffffff"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/rl_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="賬號" />
<EditText
android:id="@+id/et_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/tv_name"
android:background="@null" />
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#E6E6E6" />
<RelativeLayout
android:id="@+id/rl_userpsw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" >
<TextView
android:id="@+id/tv_psw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="密碼" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/tv_psw"
android:inputType="textPassword"
android:background="@null" />
</RelativeLayout>
</LinearLayout>
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/layout"
android:layout_centerHorizontal="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:background="#3C8DC4"
android:text="登錄"
android:textColor="#ffffff" />
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="注冊"
android:textColor="#3e82bf"
android:layout_below="@id/btn_login"
android:layout_marginTop="60dp"
android:layout_centerHorizontal="true"
android:onClick="click"
>
</TextView>
</RelativeLayout>
注冊頁面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/iv_head"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="160dp"
android:src="@drawable/tx"/>
<LinearLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/iv_head"
android:layout_margin="10dp"
android:background="#ffffff"
android:orientation="vertical" >
<RelativeLayout
android:id="@+id/rl_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="賬號" />
<EditText
android:id="@+id/et_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/tv_name"
android:background="@null" />
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#E6E6E6" />
<RelativeLayout
android:id="@+id/rl_userpsw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" >
<TextView
android:id="@+id/tv_psw"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="密碼" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/tv_psw"
android:inputType="textPassword"
android:background="@null" />
</RelativeLayout>
</LinearLayout>
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/layout"
android:layout_centerHorizontal="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:background="#3C8DC4"
android:text="注冊"
android:textColor="#ffffff" />
</RelativeLayout>
播放器主頁
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ZHUMainActivity">
<LinearLayout
android:orientation="horizontal"
android:id="@+id/main_textview"
android:layout_width="match_parent"
android:layout_height="40dp">
<Button
android:id="@+id/mPreviousBtn"
android:text="上一曲"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<Button
android:id="@+id/mPlayBtn"
android:text="播放/暫停"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<Button
android:id="@+id/mNextBtn"
android:text="下一曲"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
</LinearLayout>
<RelativeLayout
android:id="@+id/main_textview1"
android:layout_below="@id/main_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/current_time_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="當前時間"/>
<TextView
android:id="@+id/total_time_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="全部時間"/>
<SeekBar
android:id="@+id/seek_bar"
style="?android:progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_toLeftOf="@id/total_time_tv"
android:layout_toRightOf="@id/current_time_tv"/>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="80dp"
>
<ListView
android:id="@+id/main_listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_below="@+id/main_textview1"
android:layout_weight="9"
/>
<Button
android:id="@+id/bt1"
android:onClick="clickk"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:text="退出登錄"
/>
</LinearLayout>
</RelativeLayout>
退出登錄頁
<?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"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:orientation="vertical"
>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:visibility="visible"
android:textColor="#333333"
android:textSize="18sp"
android:layout_marginBottom="16dp"
/>
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:textColor="#999999"
android:textSize="14sp"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:id="@+id/netive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:layout_weight="1"
android:gravity="center"
android:textColor="#999999"
android:textSize="16sp"
/>
<Button
android:id="@+id/positive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:layout_weight="1"
android:gravity="center"
android:textColor="#38ADFF"
android:textSize="16sp"
/>
</LinearLayout>
</LinearLayout>
4.3 Java代碼
Mainactivity.java
package cn.itcase.dmtplayer;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et_account; //賬號輸入框
private EditText et_password; //密碼輸入框
private Button btn_login; //登錄按鈕
private TextView textView; //注冊按鈕
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//通過SharedPreferences方法獲取賬號密碼
Map<String,String> userInfo=Password.getUserInfo(this);
if (userInfo!=null){
//將獲取的賬號顯示到界面上
et_account.setText(userInfo.get("account"));
//將獲取的密碼顯示到界面上
et_password.setText(userInfo.get("password"));
}
}
private void initView(){
et_account=(EditText)findViewById(R.id.et_number);
et_password=(EditText)findViewById(R.id.et_password);
btn_login=(Button)findViewById(R.id.btn_login);
textView=(TextView)findViewById(R.id.textview);
btn_login.setOnClickListener(this);
}
public void onClick(View view){
switch (view.getId()){
case R.id.btn_login:
String ZH="admin";
String MM="admin";
//點擊登錄按鈕,獲取界面上的賬號和密碼
String account1=et_account.getText().toString().trim();
String password1=et_password.getText().toString();
//檢測賬號是否為空
if (TextUtils.isEmpty(account1)){
Toast.makeText(this,"請輸入賬號", Toast.LENGTH_LONG).show();
return;
}
//檢測密碼是否為空
if (TextUtils.isEmpty(password1)){
if (ZH.equals(account1)){
Toast.makeText(this,"請輸入密碼",Toast.LENGTH_LONG).show();}
else{
Toast.makeText(this,"無效賬號,請先注冊",Toast.LENGTH_SHORT).show();
}
return;
}
//檢測輸入的賬號和密碼是否正確
if (ZH.equals(account1)&&MM.equals(password1)){
Intent intent1=new Intent(MainActivity.this,ZHUMainActivity.class);
startActivity(intent1);
Toast.makeText(this,"登錄成功",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this,"賬號或密碼錯誤",Toast.LENGTH_SHORT).show();
}
break;
}
}
public void click(View view){
Intent intent=new Intent(MainActivity.this,MainActivity2.class);
startActivityForResult(intent,1);
}
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode,data);
if (requestCode==1&&resultCode==2){
String acquiredData=data.getStringExtra("zczh");
et_account.setText(acquiredData);
}
}
}
Mainactivity2.java
package cn.itcase.dmtplayer;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Map;
public class MainActivity2 extends AppCompatActivity implements View.OnClickListener {
private EditText et_account; //賬號輸入框
private EditText et_password; //密碼輸入框
private Button btn_login; //注冊按鈕
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.zhuce);
initView();
//通過SharedPreferences方法獲取賬號密碼
Map<String,String> userInfo=Password.getUserInfo(this);
if (userInfo!=null){
//將獲取的賬號顯示到界面上
et_account.setText(userInfo.get("account"));
//將獲取的密碼顯示到界面上
et_password.setText(userInfo.get("password"));
}
}
private void initView(){
et_account=(EditText)findViewById(R.id.et_number);
et_password=(EditText)findViewById(R.id.et_password);
btn_login=(Button)findViewById(R.id.btn_login);
btn_login.setOnClickListener(this);
}
public void onClick(View view){
switch (view.getId()){
case R.id.btn_login:
//點擊注冊按鈕,獲取界面上的賬號和密碼
String account=et_account.getText().toString().trim();
String password=et_password.getText().toString();
//檢測賬號是否為空
if (TextUtils.isEmpty(account)){
Toast.makeText(this,"請輸入賬號", Toast.LENGTH_LONG).show();
return;
}
//檢測密碼是否為空
if (TextUtils.isEmpty(password)){
Toast.makeText(this,"請輸入密碼",Toast.LENGTH_LONG).show();
return;
}
//保存注冊的賬號和密碼
boolean isSaveSuccess=Password.saveUserInfor(this,account,password);
if (isSaveSuccess){
Toast.makeText(this,"注冊成功",Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(this,"注冊失敗",Toast.LENGTH_LONG).show();
}
Intent intent=new Intent();
intent.putExtra("zczh",account);
setResult(2,intent);
finish();
break;
}
}
}
haunying.java
package cn.itcase.dmtplayer;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class huanying extends AppCompatActivity {
private Button huan;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.huanying);
huan=(Button)findViewById(R.id.huan);
}
public void cllick(View view){
Intent intent=new Intent(huanying.this,MainActivity.class);
startActivity(intent);
}
}
ZHUMainactivity.java
package cn.itcase.dmtplayer;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class ZHUMainActivity extends AppCompatActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, MediaPlayer.OnCompletionListener {
private MediaPlayer mediaPlayer;//播放音頻的
private Button mPreviousBtn;
private Button mPlayBtn;
private Button mNextBtn;
private Button bt1;
private ListView mListView;
private List<Song> list;
private MyAdapter adapter;
private SeekBar mSeekBar;
private TextView mCurrentTimeTv;
private TextView mTotalTimeTv;
// 記錄當前播放歌曲的位置
private int mCurrentPosition;
private Handler mHandler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
// 展示給進度條和當前時間
int progress = mediaPlayer.getCurrentPosition();
mSeekBar.setProgress(progress);
mCurrentTimeTv.setText(parseTime(progress));
// 繼續定時發送數據
updateProgress();
return true;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.zhuactivity_main);
mediaPlayer = new MediaPlayer();
mPreviousBtn= (Button) findViewById(R.id.mPreviousBtn);
mPlayBtn= (Button) findViewById(R.id.mPlayBtn);
mNextBtn= (Button) findViewById(R.id.mNextBtn);
bt1=(Button)findViewById(R.id.bt1);
mCurrentTimeTv= (TextView) findViewById(R.id.current_time_tv);
mTotalTimeTv= (TextView) findViewById(R.id.total_time_tv);
mSeekBar= (SeekBar) findViewById(R.id.seek_bar);
mSeekBar.setOnSeekBarChangeListener(this);
mPreviousBtn.setOnClickListener(this);
mPlayBtn.setOnClickListener(this);
mNextBtn.setOnClickListener(this);
initView();
}
/**
* 初始化view
*/
private void initView() {
mListView = (ListView) findViewById(R.id.main_listview);
list = new ArrayList<>();
//把掃描到的音樂賦值給list
list = MusicUtils.getMusicData(this);
adapter = new MyAdapter(this,list);
mListView.setAdapter(adapter);
mediaPlayer.setOnCompletionListener(this);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
mCurrentPosition=i;
changeMusic(mCurrentPosition);
}
});
}
@Override
public void onClick(View view) {
if (view.getId()==R.id.mPreviousBtn){//上一曲
changeMusic(--mCurrentPosition);
}else if (view.getId()==R.id.mPlayBtn){//暫停/播放
// 首次點擊播放按鈕,默認播放第0首
if (mediaPlayer==null){
changeMusic(0);
}else {
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else {
mediaPlayer.start();
}
}
}else if (view.getId()==R.id.mNextBtn){// 下一首
changeMusic(++mCurrentPosition);
}
}
// 基本數據類型和String在方法調用中傳遞的是值
// 其他數據類型在方法調用中傳遞的是引用
//切歌
private void changeMusic(int position){
if (position<0){
mCurrentPosition = position =list.size()-1;
}else if (position>list.size()-1){
mCurrentPosition = position=0;
}
if (mediaPlayer==null){
mediaPlayer=new MediaPlayer();
}
try {
// 切歌之前先重置,釋放掉之前的資源
mediaPlayer.reset();
// 設置播放源
mediaPlayer.setDataSource(list.get(position).path);
// 開始播放前的准備工作,加載多媒體資源,獲取相關信息
mediaPlayer.prepare();
// 開始播放
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
// 切歌時重置進度條並展示歌曲時長
mSeekBar.setProgress(0);
mSeekBar.setMax(mediaPlayer.getDuration());
mTotalTimeTv.setText(parseTime(mediaPlayer.getDuration()));
updateProgress();
}
private void updateProgress() {
// 使用Handler每間隔1s發送一次空消息,通知進度條更新
Message msg = Message.obtain();// 獲取一個現成的消息
// 使用MediaPlayer獲取當前播放時間除以總時間的進度
int progress = mediaPlayer.getCurrentPosition();
msg.arg1 = progress;
mHandler.sendMessageDelayed(msg, INTERNAL_TIME);
}
private String parseTime(int oldTime) {
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");// 時間格式
String newTime = sdf.format(new Date(oldTime));
return newTime;
}
private static final int INTERNAL_TIME = 1000;// 音樂進度間隔時間
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
// 當手停止拖拽進度條時執行該方法
// 獲取拖拽進度
// 將進度對應設置給MediaPlayer
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int progress = seekBar.getProgress();
mediaPlayer.seekTo(progress);
}
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
changeMusic(++mCurrentPosition);
}
public void clickk(View view) {
final exitthis dialog = new exitthis(ZHUMainActivity.this);
dialog.setTitle("提示");
dialog.setMessage("是否退出登錄?");
dialog.setNegtive("取消");
dialog.setPositive("確定");
dialog.setOnClickBottomListener(new exitthis.OnClickBottomListener() {
@Override
public void onPositiveClick() {
dialog.dismiss();
ZHUMainActivity.this.finish();
}
@Override
public void onNegtiveClick() {
dialog.dismiss();
}
});
dialog.show();
}
}
MusicUtils.java
package cn.itcase.dmtplayer;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import java.util.ArrayList;
import java.util.List;
/*
* 音樂工具類,
*/
public class MusicUtils {
/**
* 掃描系統里面的音頻文件,返回一個list集合
*/
public static List<Song> getMusicData(Context context) {
List<Song> list = new ArrayList<Song>();
// 媒體庫查詢語句(寫一個工具類MusicUtils)
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,
null, MediaStore.Audio.AudioColumns.IS_MUSIC);
if (cursor != null) {
while (cursor.moveToNext()) {
Song song = new Song();
song.song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
song.singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
song.path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
song.duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
song.size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
if (song.size > 1000 * 800) {
// 注釋部分是切割標題,分離出歌曲名和歌手 (本地媒體庫讀取的歌曲信息不規范)
if (song.song.contains("-")) {
String[] str = song.song.split("-");
song.singer = str[0];
song.song = str[1];
}
list.add(song);
}
}
// 釋放資源
cursor.close();
}
return list;
}
/**
* 定義一個方法用來格式化獲取到的時間
*/
public static String formatTime(int time) {
if (time / 1000 % 60 < 10) {
return time / 1000 / 60 + ":0" + time / 1000 % 60;
} else {
return time / 1000 / 60 + ":" + time / 1000 % 60;
}
}
}
Password.java
package cn.itcase.dmtplayer;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.HashMap;
import java.util.Map;
public class Password{
//保存賬號和密碼到data.xml文件中
public static boolean saveUserInfor(Context context, String account, String password){
SharedPreferences sp=context.getSharedPreferences("data",Context.MODE_PRIVATE);
SharedPreferences.Editor edit=sp.edit();
edit.putString("userName",account);
edit.putString("pwd",password);
edit.commit();
return true;
}
//從data.xml文件中獲取存儲的賬號和密碼
public static Map<String,String> getUserInfo(Context context){
SharedPreferences sp=context.getSharedPreferences("data",Context.MODE_PRIVATE);
String account =sp.getString("userName",null);
String password=sp.getString("pwd",null);
Map<String,String>userMap=new HashMap<String, String>();
userMap.put("account",account);
userMap.put("password",password);
return userMap;
}
}
song.java
package cn.itcase.dmtplayer;
/**
* 放置音樂
*/
class Song {
/**
* 歌手
*/
public String singer;
/**
* 歌曲名
*/
public String song;
/**
* 歌曲的地址
*/
public String path;
/**
* 歌曲長度
*/
public int duration;
/**
* 歌曲的大小
*/
public long size;
}
exittis.java
package cn.itcase.dmtplayer;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class exitthis extends AlertDialog {
private TextView titleTv;
private TextView messageTv;
private Button negtiveBn,positiveBn;
public exitthis(Context context) {
super(context);
}
private String message;
private String title;
private String positive,negtive;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.exitthis);
negtiveBn=(Button)findViewById(R.id.netive);
positiveBn=(Button)findViewById(R.id.positive);
titleTv=(TextView)findViewById(R.id.title);
messageTv=(TextView)findViewById(R.id.message);
initEvent();
}
public void refreshView(){
if (!TextUtils.isEmpty(title)){
titleTv.setText(title);
titleTv.setVisibility(View.VISIBLE);
}else{
titleTv.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(message)){
messageTv.setText(message);
}
if (!TextUtils.isEmpty(positive)){
positiveBn.setText(positive);
}else{
positiveBn.setText("確定");
}
if (!TextUtils.isEmpty(negtive)){
negtiveBn.setText(negtive);
}else{
negtiveBn.setText("取消");
}
}
private void initEvent(){
positiveBn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if (onClickBottomListener!=null){
onClickBottomListener.onPositiveClick();
}
}
});
negtiveBn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if (onClickBottomListener!=null){
onClickBottomListener.onNegtiveClick();
}
}
});
}
public void show(){
super.show();
refreshView();
}
public interface OnClickBottomListener{
void onPositiveClick();
void onNegtiveClick();
}
public OnClickBottomListener onClickBottomListener;
public exitthis setOnClickBottomListener(OnClickBottomListener onClickBottomListener){
this.onClickBottomListener=onClickBottomListener;
return this;
}
public exitthis setMessage(String message){
this.message=message;
return this;
}
public exitthis setTitle(String title){
this.title=title;
return this;
}
public exitthis setNegtive(String negtive){
this.negtive=negtive;
return this;
}
public exitthis setPositive(String positive){
this.positive=positive;
return this;
}
}