Android 课设之个人音乐播放器

news2024/12/28 18:52:24

第一章 绪论

1.1选题背景

由于时代快速发展,各种各样的音乐播放器层出不穷,此时需要一个可以根据个人爱好来播放的音乐播放器就尤为重要,因此我特意制作了一个根据自己喜好的音乐播放器,只需要把音乐文件放进制定的目录下即可。

1.2开发技术

该App利用了SQlite数据库对于用户的管理,还有MediaPlayer媒体播放器的使用,和各种布局加以一些控件得以使界面看着舒服,还有利用了广播信息对于用户的操作进行提示。并且对于音乐文件得存储也使用了sdcard文件存储的技术,还有组件间的通信和广播信息等技术。主要使用Android,java开发。

第二章 需求及可行性分析

2.1需求分析

Android应用软件包含人机界面(控件、菜单、工具栏、对话框等)、组件通信、后台服务、数据存储、媒体播放、手机特色等功能。

2.2 可行性分析

  1. 首先要对用户进行注册和登录修改删除等功能:可以使用sqlite数据库

  1. 要扫描文件夹的mp3文件:使用Java文件流的读写操作和Android的存取权限控制

  1. 要实现音乐的播放:使用MediaPlayer类来对音乐进行操作

  1. 布局使用安卓自带的LinearLayout标签

  1. 菜单使用安卓自带的Menu类

  1. 按钮使用安卓自带的Button类

  1. 还有对权限进行控制:使用Mainfest.permission等属性赋予权限

  1. 对于组件间的通信使用Intent类

  1. 对于部分广播信息使用Toast类

  1. 确定使用的技术,进行实际开发。

第三章 系统分析

MainActivity类

Protect void onCreate(Budle): 构建主界面

对于主页面一些组件的管理和对于一些事件的监听

Record类

对于一些常用的变量要做静态存储处理,比如说用户名,密码,数据库链接,还有登录时间,当前播放的音乐文件等

MusicActivity类

该类主要用于音乐播放的初始化处理和对音乐进行播放,暂停,重置播放等功能,以下是该类应该具备的功能。

Protect void onCreate(Bundle): 构建播放音乐界面

Public boolean onCreateOptionsMenu(Menu): 添加菜单(返回,注销,更新信息)这个功能应当用于登录之后的每一个页面

Public void onOptionsItemSelected(MenuItem):对于子菜单进行监听处理,这个功能也应当用于登录之后的每一个页面

Public void onRequestPermissionsResult(int String[] int[]): 对于音乐播放的权限处理

Protect void onDestroy(): 用于关闭释放MediaPlayer播放器

Private void initMediaPlayer(): 对于MusicPlayer进行初始化和准备工作。

Time类

该类主要用于获取当前时间(原本还写了一个日志类,但是由于时间紧凑,该类的功能没能得到补充)

Public static String getCurrentTime() 用于获取当前时间

DBAdapter类

该类主要对于数据库的一些增删查改操作进行封装,此处方法过多就不进行一一解释了。只介绍一些重要的方法和内部类。

Private static Class DBOpenHelper extends SQLiteOpenHelper静态Helper类,用于建立更新和打开数据库

Public long insert(User): 用于插入用户,实现注册功能

Public User queryOneData(String String): 用于查找指定某一个用户,实现用户登录功能。

Public long deleteOneData(String): 用于删除某个指定用户,实现用户注销功能。

Public long updateOneData(String User):根据指定条件更新某个用户的信息,实现更新用户信息功能。

User 类

对于数据库的用户表而建的用户类。

UserMsgActivity类

该类用于展示用户登录之后的页面,比如说展示一些提示信息,登陆时间和用户喜爱的音乐,还有菜单的对用户的信息进行管理。有以下主要方法

Protect void onCreate(Bundle): 创建用户登录之后的页面

Public void find(File, String): 查找某一个指定文件,也就是实现播放某一个指定音乐功能。

Public ArrayList<File> getAllMusic(): 获取目录下的所有音乐文件。

Public boolean onCreateOptionsMenu(Menu): 添加菜单(返回,注销,更新信息)这个功能应当用于登录之后的每一个页面

Public void onOptionsItemSelected(MenuItem):对于子菜单进行监听处理,这个功能也应当用于登录之后的每一个页面

UpdateUser 类

该类用于展示用户更新信息的页面,实现用户更新密码,更换用户名等功能。

Protect void onCreate(Bundle) : 用于创建用户更新信息的页面。

Public boolean onCreateOptionsMenu(Menu): 添加菜单(返回,注销,更新信息)这个功能应当用于登录之后的每一个页面

Public void onOptionsItemSelected(MenuItem):对于子菜单进行监听处理,这个功能也应当用于登录之后的每一个页面

还有一些事件监听方法过多就不进行一一列举了。

第四章 系统设计及实现

4.1系统设计:

首先应当分为四个包分别装有对应功能的类,如下图:

activity包下存放的是更新用户信息类(UpdateUser)和展示用户信息类(UserMsgActivity)

DB包下存放的是数据库操作类(DBAdapter)和实体用户类(User)

log包下存放的是日志类(Logger)和时间类(Time)// 注:日志类暂无实现该功能

lyl包下存放的是主类(MainActivity)和记录类(Record)

musicplayer包下存放的是音乐操作类(MusicActivity)

4.2实现

com.example.activity.UpdateUser

package com.example.activity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.example.DB.User;
import com.example.lyl.R;
import com.example.lyl.Record;

public class UpdateUser extends Activity {

    private EditText agoPassword;
    private EditText newPassword;
    private EditText againPassword;
    private EditText agoUsername;
    private EditText newUsername;
    private Button updatePassword;
    private Button updateUsername;
    private Button resetUsername;
    private Button resetPassword;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.updateuser);

        agoPassword = findViewById(R.id.editAgoPassword);
        newPassword = findViewById(R.id.editNewPassword);
        againPassword = findViewById(R.id.editAgainPassword);
        updatePassword = findViewById(R.id.updatePassword);
        agoUsername = findViewById(R.id.editAgoUsername);
        newUsername = findViewById(R.id.editNewUsername);
        resetPassword = findViewById(R.id.resetPassword);
        updateUsername = findViewById(R.id.updateBtnUsername);
        resetUsername = findViewById(R.id.resetUsername);

        agoUsername.setText(Record.username);

        updatePassword.setOnClickListener(onUpdatePwClickListener);
        updateUsername.setOnClickListener(onUpdateUnClickListener);
        resetPassword.setOnClickListener(onResetPwClickListener);
        resetUsername.setOnClickListener(onResetUnClickListener);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        if(item.getTitle().equals("返回")){
            setResult(RESULT_CANCELED,null);
            finish();
        }
        else if(item.getTitle().equals("注销")){
            Record.dbAdapter.deleteOneData(Record.username);
            Toast.makeText(UpdateUser.this,"注销成功",Toast.LENGTH_LONG).show();
            setResult(RESULT_CANCELED,null);
            finish();
            Intent intent = new Intent(UpdateUser.this,com.example.lyl.MainActivity.class);
            startActivity(intent);
        }
        else if(item.getTitle().equals("更新信息")){
            Intent intent = new Intent(UpdateUser.this,UpdateUser.class);
            startActivity(intent);
        }
        return true;
    }

    View.OnClickListener onUpdatePwClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String agoPw = agoPassword.getText().toString();
            String newPw = newPassword.getText().toString();
            String againPw = againPassword.getText().toString();

            User user = new User();

            if(agoPw.equals(Record.password)){
                if(newPw.equals(againPw)){
                    user.setUsername(Record.username);
                    user.setPassword(newPw);
                    Record.dbAdapter.updateOneData(user.getUsername(),user);
                    Record.password = againPw;
                    Toast.makeText(UpdateUser.this,"更新密码成功",Toast.LENGTH_LONG).show();
                }
                else{
                    Toast.makeText(UpdateUser.this,"两次密码不一样",Toast.LENGTH_LONG).show();
                }
            }
            else {
                Toast.makeText(UpdateUser.this,"旧密码不正确",Toast.LENGTH_LONG).show();
            }
        }
    };

    View.OnClickListener onUpdateUnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String ago_Username = agoUsername.getText().toString();
            String new_Username = newUsername.getText().toString();
            User user = new User();
            if(Record.username.equals(ago_Username)){
                if(!new_Username.equals("")){
                    user.setUsername(new_Username);
                    user.setPassword(Record.password);
                    Record.dbAdapter.updateOneData(ago_Username,user);
                    Record.username = new_Username;
                    Toast.makeText(UpdateUser.this,"用户名更改成功",Toast.LENGTH_LONG).show();
                }
                else{
                    Toast.makeText(UpdateUser.this,"用户名不能为空",Toast.LENGTH_LONG).show();
                }
            }
            else{
                Toast.makeText(UpdateUser.this,"旧用户名不正确",Toast.LENGTH_LONG).show();
            }
        }
    };

    View.OnClickListener onResetPwClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            agoPassword.setText("");
            againPassword.setText("");
            newPassword.setText("");
        }
    };

    View.OnClickListener onResetUnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            agoUsername.setText("");
            newUsername.setText("");
        }
    };
}

com.example.activity.UserMsgActivity

package com.example.activity;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.example.DB.DBAdapter;
import com.example.log.Time;
import com.example.lyl.R;
import com.example.lyl.Record;
import com.example.musicplayer.MusicActivity;

import java.io.File;
import java.util.ArrayList;
import java.util.List;


public class UserMsgActivity extends Activity {

    private static Manifest.permission permission;
    public ArrayList<File> listMusic = new ArrayList<>();

    private DBAdapter dbAdapter;
    private TextView times;
    private TextView userText;
    private ListView listView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.show);

        times = findViewById(R.id.times);
        userText = findViewById(R.id.userText);
        Record.Times = Time.getCurrentTime();
        times.setText("登录时间为:"+Record.Times);
        userText.setText("欢迎你: "+Record.username+"用户");

        dbAdapter = new DBAdapter(this);
        dbAdapter.open();

        getAllMusic();
//        for(int i=0;i<listMusic.size();i++){
//            System.out.print("第"+(i+1)+"首:");
//            System.out.println(listMusic.get(i).getName());
//        }
        List<String> list = new ArrayList<>();
        listView = findViewById(R.id.ListViewMusic);
        for(int i=0;i<listMusic.size();i++){
            String musicName = listMusic.get(i).getName();
            System.out.print("第"+(i+1)+"首:");
            System.out.println(musicName);
            int rex = musicName.indexOf("伦");
            String newMusicName = musicName.substring(0,rex+1) + ".mp3";
            System.out.println(newMusicName);
            list.add(newMusicName);
        }
        Record.list = list;
        Record.lastViewFlag = true;
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,list);
        listView.setAdapter(adapter);
        Record.listView = listView;

        listView.setOnItemClickListener(listViewListener);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        if(item.getTitle().equals("返回")){
            listView.clearDisappearingChildren();
            setResult(RESULT_CANCELED,null);
            finish();
        }
        else if(item.getTitle().equals("注销")){
            dbAdapter.deleteOneData(Record.username);
            Toast.makeText(UserMsgActivity.this,"注销成功",Toast.LENGTH_LONG).show();
            setResult(RESULT_CANCELED,null);
            finish();
            Intent intent = new Intent(UserMsgActivity.this,com.example.lyl.MainActivity.class);
            startActivity(intent);
        }
        else if(item.getTitle().equals("更新信息")){
            Intent intent = new Intent(UserMsgActivity.this,UpdateUser.class);
            startActivity(intent);
        }
        return true;
    }

    public ArrayList<File> getAllMusic(){

        File dir = new File("/sdcard/music/");
        boolean exitFlag = dir.exists();
        boolean canWrite = dir.canWrite();
        System.out.println("存在吗:"+exitFlag+"\n可读吗:"+canWrite);
        if (ContextCompat.checkSelfPermission(UserMsgActivity.this, UserMsgActivity.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //申请WRITE_EXTERNAL_STORAGE权限
            ActivityCompat.requestPermissions(UserMsgActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    Context.MODE_ENABLE_WRITE_AHEAD_LOGGING);
        }
        String str = ".mp3";
        String exegc = "^.+" + str + "$";  //匹配以str为后缀名的文件;
        File file = dir;
        if (!file.exists()) {
            System.out.println("您要查找的路径不存在,请重新输入:");
            getAllMusic();
        } else if (!file.isDirectory()) {
            System.out.println("您输入的不是文件夹,请重新输入:");
            getAllMusic();
        } else {
            find(file, exegc);   //调用方法;
//                if (count == 0) {
//                    System.out.println("没有您要找的" + str + "为后缀名的文件");
//                } else {
//                    System.out.println(path + "文件夹下共有以" + count + "个以" + str + "为后缀名的文件");
        }
        return listMusic;
    }

    private void find(File file1, String exegc) {

        File[] lists = file1.listFiles();  //将当前文件夹下的文件和文件夹放入数组中
        for (int i = 0; i < lists.length; i++) {
            if (lists[i].isDirectory()) {
                find(lists[i], exegc);
            } else {
                if (lists[i].getName().matches(exegc)) {
                    System.out.println(lists[i].getAbsolutePath());
                    listMusic.add(lists[i]);
//                        count++;
                }
            }
        }
    }

    AdapterView.OnItemClickListener listViewListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            File file = listMusic.get((int) id);
            Record.file = file;
            String musicName = file.getName();
            int rex = musicName.indexOf("伦");
            String newMusicName = musicName.substring(0,rex+1) + "    正在播放";
            Record.musicText = newMusicName;
            Intent intent = new Intent(UserMsgActivity.this, MusicActivity.class);
            startActivity(intent);
        }
    };
}

com.example.DB.DBAdapter

package com.example.DB;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DBAdapter {

    private static final String DB_NAME = "people.db";
    private static final String DB_TABLE = "personinfo";
    private static final int DB_VERSION = 1;

    public static final String KEY_ID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_PASSWORD = "password";

    private SQLiteDatabase db;
    private final Context context;
    private DBOpenHelper dbOpenHelper;

    public DBAdapter(Context _context) {
        context = _context;
    }

    /** Close the database */
    public void close() {
        if (db != null){
            db.close();
            db = null;
        }
    }

    /** Open the database */
    public void open() throws SQLiteException {
        dbOpenHelper = new DBOpenHelper(context, DB_NAME, null, DB_VERSION);
        try {
            db = dbOpenHelper.getWritableDatabase();
        }
        catch (SQLiteException ex) {
            db = dbOpenHelper.getReadableDatabase();
        }
    }


    public long insert(User people) {
        ContentValues newValues = new ContentValues();

        newValues.put(KEY_NAME, people.getUsername());
        newValues.put(KEY_PASSWORD, people.getPassword());

        System.out.println(people);
        return db.insert(DB_TABLE, null, newValues);
    }


    public User[] queryAllData() {
        Cursor results =  db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_PASSWORD },
                null, null, null, null, null);
        return ConvertToPeople(results);
    }

    public User[] queryOneData(String name,String password) {
        Cursor results =  db.query(DB_TABLE, new String[] { KEY_ID, KEY_NAME, KEY_PASSWORD },
                KEY_NAME + "= ? AND " + KEY_PASSWORD + "= ? " , new String[]{name,password},null,null,null );
        return ConvertToPeople(results);
    }

    private User[] ConvertToPeople(Cursor cursor){
        int resultCounts = cursor.getCount();
        if (resultCounts == 0 || !cursor.moveToFirst()){
            return null;
        }
        User[] peoples = new User[resultCounts];
        for (int i = 0 ; i<resultCounts; i++){
            peoples[i] = new User();
            peoples[i].ID = cursor.getInt(0);
            peoples[i].Username= cursor.getString(cursor.getColumnIndex(KEY_NAME));
            peoples[i].password = cursor.getString(cursor.getColumnIndex(KEY_PASSWORD));

            cursor.moveToNext();
        }
        return peoples;
    }

    public long deleteAllData() {
        return db.delete(DB_TABLE, null, null);
    }

    public long deleteOneData(String name) {
        System.out.println(name);
        return db.delete(DB_TABLE,  KEY_NAME + "='" + name + "'", null);
    }

    public long updateOneData(String name , User people){
        ContentValues updateValues = new ContentValues();
        updateValues.put(KEY_NAME, people.Username);
        updateValues.put(KEY_PASSWORD, people.password);

        return db.update(DB_TABLE, updateValues,  KEY_NAME + "='" + name + "'", null);
    }

    /** 静态Helper类,用于建立、更新和打开数据库*/
    private static class DBOpenHelper extends SQLiteOpenHelper {

        public DBOpenHelper(Context context, String name, CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        private static final String DB_CREATE = "create table " +
                DB_TABLE + " (" + KEY_ID + " integer primary key autoincrement, " +
                KEY_NAME+ " text not null, " + KEY_PASSWORD+ " text );";

        @Override
        public void onCreate(SQLiteDatabase _db) {
            _db.execSQL(DB_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) {
            _db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);
            onCreate(_db);
        }
    }
}

com.example.DB.User

package com.example.DB;

public class User {
    public int ID = -1;
    public String Username;
    public String password;

    public String getUsername() {
        return Username;
    }

    public void setUsername(String username) {
        Username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString(){
        String result = "";
        result += "ID:" + this.ID + ",";
        result += "用户名:" + this.Username + ",";
        result += "密码:" + this.password;
        return result;
    }
}

com.example.log.Logger

package com.example.log;

import android.os.BugreportManager;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Logger {
    private static File file = null;
    private static String path = "C:\\Users\\Dell is very good\\Documents\\AndroidStudio\\Log\\log.txt";
    private static FileOutputStream fos = null;
    private static BufferedOutputStream bfos = null;

    public static void initFile(){
        file = new File(path);
        try{
            fos = new FileOutputStream(file,true);
            bfos = new BufferedOutputStream(fos);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void writeLog(String text){
        Logger.initFile();
        if(file!=null){
            try{
                text += "\n";
                String time = com.example.log.Time.getCurrentTime()+'\n';
                byte[] buff = text.getBytes();
                byte[] buffTime = time.getBytes();
                bfos.write(buffTime);
                bfos.write(buff);
                bfos.flush();
                fos.flush();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                if(bfos!=null){
                    try {
                        bfos.close();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
                if(fos!=null){
                    try{
                        fos.close();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
                else{
                    System.out.println("fos是null");
                }
            }
        }
        else{
            System.out.println("file是null");
        }
    }
}

com.example.log.Time

package com.example.log;


import java.text.SimpleDateFormat;
import java.util.Date;

public class Time {
    public static String getCurrentTime(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = new Date();
        String timeString = sdf.format(d);
        System.out.println("当前时间为: "+timeString);
        return timeString;
    }
}

com.example.lyl.MainActivity

package com.example.lyl;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.example.DB.DBAdapter;
import com.example.DB.User;
import com.example.activity.UserMsgActivity;


public class MainActivity extends Activity {

    private DBAdapter dbAdepter ;

    private EditText editUsername;
    private EditText editPassword;
    private TextView labelView;
    private Button btnRegister;
    private Button btnLogin;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        editUsername = findViewById(R.id.editUsername);
        editPassword = findViewById(R.id.editPassword);
        labelView = findViewById(R.id.show);
        btnLogin = findViewById(R.id.login);
        btnRegister = findViewById(R.id.register);

        btnRegister.setOnClickListener(btnRegisterListener);
        btnLogin.setOnClickListener(btnLoginButtonListener);

        dbAdepter = new DBAdapter(this);
        dbAdepter.open();
        Record.dbAdapter = dbAdepter;
    }

    View.OnClickListener btnRegisterListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            ContentValues values = new ContentValues();
            User user = new User();
            String name = editUsername.getText().toString();
            String password = editPassword.getText().toString();
            if (!name.equals("") && !password.equals("")) {
                user.Username = name;
                user.password = password;
                try {
                    long colunm = dbAdepter.insert(user);
                    if (colunm == -1) {
                        labelView.setText("添加过程错误!");
                    } else {
                        Toast.makeText(MainActivity.this,"注册成功",Toast.LENGTH_LONG).show();
                        labelView.setText("成功添加数据,ID:" + String.valueOf(colunm));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    labelView.setText("添加过程错误!");
                }
            } else {
                labelView.setText("你的输入有误!");
            }
        }
    };

    View.OnClickListener btnLoginButtonListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String name = null;
            String password;
            User[] peoples =null;
            if(!editUsername.getText().toString().equals("")) {
                try {
                    name = editUsername.getText().toString();
                    password = editPassword.getText().toString();
                    peoples = dbAdepter.queryOneData(name,password);
                    Record.username = name;
                    Record.password = password;
                    labelView.setText("没问题");
                    if(peoples!=null) {
                        Intent intent = new Intent(MainActivity.this, com.example.activity.UserMsgActivity.class);
                        startActivity(intent);
                        Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_LONG).show();
                    }
                }catch (Exception e){
                    e.printStackTrace();
                    labelView.setText("数据库中没有Name为"+name+"的数据或者密码错误");
                }
            }
            else{
                labelView.setText("请输入用户名");
            }
            if (peoples == null && name!=null){
                labelView.setText("数据库中没有Name为"+name+"的数据或者密码错误");
                return;
            }
        }
    };
}
com.example.lyl.Record
package com.example.lyl;


import android.widget.ListView;

import com.example.DB.DBAdapter;

import java.io.File;
import java.util.List;

public class Record {
    public static DBAdapter dbAdapter;
    public static String username;
    public static String Times;
    public static String password;
    public static ListView listView;
    public static File file;
    public static List list = null;
    public static boolean lastViewFlag = false;
    public static String musicText;
}

com.example.musicplayer.MusicActivity

package com.example.musicplayer;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.activity.UpdateUser;
import com.example.lyl.R;
import com.example.lyl.Record;
import java.io.IOException;

public class MusicActivity extends Activity {
    private Button play;
    private Button pause;
    private Button replay;
    private TextView musicText;
    private MediaPlayer mediaPlayer = new MediaPlayer();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        play = findViewById(R.id.play);
        pause = findViewById(R.id.pause);
        replay = findViewById(R.id.replay);
        musicText = findViewById(R.id.music);
        musicText.setText(Record.musicText);
        if (ContextCompat.checkSelfPermission(MusicActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(MusicActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
        }else {
            try { //权限申请
                initMediaPlayer();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!mediaPlayer.isPlaying()){
                    mediaPlayer.start();
                }
            }
        });
        pause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                }
            }
        });
        replay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.reset();
                    try {
                        initMediaPlayer();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        if(item.getTitle().equals("返回")){
            Record.listView.clearDisappearingChildren();
            setResult(RESULT_CANCELED,null);
            finish();
        }
        else if(item.getTitle().equals("注销")){
            Record.dbAdapter.deleteOneData(Record.username);
            Toast.makeText(MusicActivity.this,"注销成功",Toast.LENGTH_LONG).show();
            setResult(RESULT_CANCELED,null);
            finish();
            Intent intent = new Intent(MusicActivity.this, com.example.lyl.MainActivity.class);
            startActivity(intent);
        }
        else if(item.getTitle().equals("更新信息")){
            Intent intent = new Intent(MusicActivity.this, UpdateUser.class);
            startActivity(intent);
        }
        return true;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    try {
                        initMediaPlayer();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }else {
                    Toast.makeText(MusicActivity.this,"权限被拒绝",Toast.LENGTH_LONG).show();
                }
                break;
            default:
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null){
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }

    private void initMediaPlayer() throws IOException {
        mediaPlayer.setDataSource(Record.file.getPath());
        mediaPlayer.prepare();
    }
}

第五章 总结与展望

5.1总结

通过这次课程设计,把之前的一些布局和控件的属性以及如何调好他们之间的排版有了更深的理解,还有组件间的通信,和广播信息,还整合了SQLite数据库,MediaPalyer媒体音乐播放器都更加熟练使用这些类的一些常用方法和常用属性。

5.2展望

大家如果仔细看的话会发现我有两个类是多余的(Logger和Time),其实这两个类我是打算用来做输出日志文件的时候用的,但是由于回家了时间比较冲突就没来得及做剩余部分了。所以有一个日志类需要扩展出来,把这个播放器的使用进行监听并写入到日志文件中方便以后进行查看更新和纠错和记录用户的操作。以便以后与用户沟通的时候有依据可说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++语法小笔记:内联函数,auto关键字,nullptr

目录 一.内联函数 1.回顾c语言中的“宏函数” 2.内联函数 3.内联函数的特性 二.C auto 关键字 1.auto的基本概念 2.auto使用的注意事项 3.auto不能使用的地方 三. C11中的 nullptr 一.内联函数 1.回顾c语言中的“宏函数” 先给出一段简单的代码&#xff1a; int Add(in…

plt设置柱状图标注

1、plt.text方法 在matplotlib 3.4.0之前的版本中&#xff0c;一般使用plt.text方法绘制数据标签。顾名思义&#xff0c;plt.text可以在图像的任何地方绘制指定的文本。基于此&#xff0c;我们只需要在相应数据点的坐标位置绘制相应的值&#xff0c;即可显示数据标签。 2、plt.…

react初始高阶组件

首先 我们要了解什么是高阶组件 第一 高阶组件必须是一个函数 第二 高阶组件接收一个参数&#xff0c;这个参数也必须是一个组件 第三 他的返回值 也是一个组件 至于高阶组件的作用 我们后续会讲解 本文只是带大家认识一下高阶组件 并手把手带大家创建一个 下面我们来创建一个…

微服务调用组件Feign学习笔记

目录 JAVA 项目中如何实现接口调用&#xff1f; 1. 什么是Feign 2. Spring Cloud Alibaba快速整合OpenFeign 3. Spring Cloud Feign的自定义配置及使用 4.自定义拦截器 5.超时时间配置 JAVA 项目中如何实现接口调用&#xff1f; 1&#xff09;Httpclient HttpClient 是 …

数据结构(模式匹配及相关算法)

目录 模式匹配 BF算法 算法实现 算法分析 KMP算法 问题的引入&#xff08;一&#xff09; 问题的引入&#xff08;二&#xff09; 问题的引入&#xff08;三&#xff09; 相关概念 计算失配函数的算法 算法思路 算法优点 模式匹配 函数int find(const sstring &am…

机器学习(三):人工智能主要分支

文章目录 人工智能主要分支 一、计算机视觉 二、语音识别 三、文本挖掘/分类 四、机器翻译 五、机器人 人工智能主要分支 通讯、感知与行动是现代人工智能的三个关键能力&#xff0c;在这里我们将根据这些能力/应用对这三个技术领域进行介绍&#xff1a; 计算机视觉(CV…

WiFi monitor模式的配置和运行检查(Ubuntu系统)

WiFi monitor模式的配置和运行检查1. WiFi monitor模式介绍2. WiFi monitor模式查看Step1&#xff1a;确保计算机上有安装硬件WiFi无线网卡Step2&#xff1a;安装必要的工具Step 3&#xff1a;iw list查看无线网卡是否支持monitor模式Step 4&#xff1a;配置WiFi monitor模式St…

有了独自开,我们离自己开发一套系统还会远吗

目录 一、结识独自开 二、独自开的介绍 三、独自开的需求 四、独自开注册流程 五、神仙公司独自开 一、结识独自开 算是机缘巧合&#xff0c;我被C站白佬拉入了他的聊天群&#xff0c;群内均是来自于CSDN的不同领域的优质作者&#xff0c;其中不乏相关领域工作多年的老工程…

“任性”华为 | 七十八岁老人的“四渡赤水”(二)

导读华为是一家“任性”的企业——因为任正非将自己的性格赋予了华为——在企业前进的每一个路口&#xff0c;都会看见这种性格的印记。2022年12月&#xff0c;当美国总统拜登出现在凤凰城出席台积电工厂迁机仪式上&#xff0c;苹果公司首席执行官库克等约900名政商界人士前往捧…

c#检测网络连接信息

用手机全屏看B站视频时可以看到右上角标识有WIFI&#xff0c;比较好奇如何检测当前网络连接是wifi还是数据网络什么的。于是百度相关信息&#xff0c;找到参考文献1-2&#xff0c;其中介绍采用Xamarin.Essentials检测网络连接性&#xff0c;其中的Connectivity类可用于监视设备…

【MATLAB】三维旋转的实现

1 三维旋转的表达方式 三维空间中常用的表示旋转的方式有&#xff1a; **[1]旋转矩阵(rotation matrix) [2]旋转向量(rotation vector&#xff09;/角轴&#xff08;轴角&#xff09;(axis angle) [3]欧拉角(euler angles) [4]四元数(quaternion)**主动旋转和被动旋转&#x…

现场工程师出手-PCAPHub与云IP实现异地LAN工业联测

在去年&#xff0c;因为众所周知的因素影响&#xff0c;项目的甲方主动提出延缓设备的交付。作为乙方&#xff0c;尽管项目延缓是甲方提出的&#xff0c;但依旧希望按期交付&#xff0c;这样才能回款&#xff0c;熬过一年。其实&#xff0c;2022年初&#xff0c;几类传感器、压…

Visual Studio 17.5 拼写检查器预览版现已推出,来说说你的看法吧

写在前面&#xff1a; Visual Studio17.5版本已添加拼写检查器功能&#xff0c;Visual Studio 中的许多功能旨在帮助你编写所需的代码。Visual Studio帮助你确保代码的编译&#xff0c;甚至可以帮助代码样式。现在它甚至可以确保您的拼写准确。Visual Studio 17.5 preview 3 引…

Linux常用命令——talk命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) talk 让用户和其他用户聊天 补充说明 talk命令是talk服务器的客户端工具&#xff0c;通过talk命令可以让用户和其他用户聊天。linux中talk命令参数程序的使用很简单&#xff0c;只要知道交谈对象的地址&#x…

plt自定义主要刻度值和次要刻度值

使用set_xticks方法和set_xticklabels方法即可 1、set_xticks方法 参数说明&#xff1a; set_xticks(self, ticks, minorFalse)参数1&#xff1a;ticks&#xff1a;指定刻度出现的位置参数2&#xff1a;minor&#xff1a;指定是否是次要刻度返回值1&#xff1a;包含XTick实例…

【数学建模】华为杯研究生数学建模备赛的一些建议

文章目录前言一、建模题目介绍1.1、题目数量1.2、题目种类1.3、题目难度1.4、题目选择二、笔者的备赛过程2.1.简单的题目&#xff08;本科比赛&#xff0c;学科大作业&#xff09;2.2.真题三、编程的备赛建议3.1.matlab和python的基础语法3.2.数据预处理3.3.常用的机器学习算法…

win10系统新增的几款非常有用的基础快捷键

win就是键盘的这个键winq或wins 打开搜索winw 打开白板、全屏截图wint 配合左右箭头←→&#xff0c;来回切换最小化窗口在任务栏的缩略图winu 设置显示器wini 打开设置winp 屏幕投影、扩展屏幕wina 查看最近消息通知winh 语音输入法wink 查找设备&#xff08;如&#xff1a;打…

线程池默认大小为CPU核数的2倍

1、前言 有位工作5年的小伙伴问我说&#xff0c;为什么Netty线程池默认大小为CPU核数的2倍&#xff0c;今天&#xff0c;我花2分钟时间给大家专门分享一下我对这个问题的理解。 另外&#xff0c;我花了1个多星期把往期的面试题解析配套文档准备好了&#xff0c;想获取的小伙伴…

Introduction to Multi-Armed Bandits——03 Thompson Sampling[1]

Introduction to Multi-Armed Bandits——03 Thompson Sampling[1] 参考资料 Russo D J, Van Roy B, Kazerouni A, et al. A tutorial on thompson sampling[J]. Foundations and Trends in Machine Learning, 2018, 11(1): 1-96. ts_tutorial 在线学习(MAB)与强化学习(RL)[…

JavaScript基础知识点整理(一)——数据类型、判定、转换、this指向

JavaScript是每一位前端开发者都必备的技能&#xff0c;接下来会分章节文章阐述介绍每一部分的内容。 JavaScript基础整理①1、JavaScript类型2、原始&#xff08;primitive&#xff09;类型3、对象&#xff08;Object&#xff09;类型4、类型判定4.1、typeof4.2、instanceof4.…