安卓課設-音樂播放器


目錄

一 需求分析... 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();
    }

附件

一 課設題目

   安卓音樂播放器

二 技術說明

  1. 歡迎頁、注冊頁、登錄頁、播放器主頁、退出登錄頁五個UI界面
  2. 實現登錄和注冊互跳轉,登錄頁跳轉到播放器頁,退出登陸頁跳轉登錄頁。
  3. 播放器使用mediaplayer實現播放/暫停、上一曲、下一曲
  4. 在登錄頁面使用SharedPreferences存儲實現記住賬號和密碼功能。
  5. 獲取的歌曲列表用ListView顯示。
  6. 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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM