前言:

小白的我在经历了两周的Android Studio实训课的学习后,编辑了简易音乐播放器的半成品,通过两周的学习让我对打码又激起了兴趣,很感谢实训老师江哥(博客ID:3052world)的悉心教导,下面我将在我两周学习分享给大家。

正文:

  1. 建立Activity,给它布局。
    下面是我的布局代码:
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal"android:background="#fd3131"><TextViewandroid:id="@+id/main_local_tv"android:layout_width="0dp"android:layout_height="50dp"android:layout_weight="1"android:text="本地音乐"android:textStyle="bold"android:textSize="20sp"android:textColor="#000"android:gravity="center" /><TextViewandroid:id="@+id/main_online_tv"android:layout_width="0dp"android:layout_height="50dp"android:layout_weight="1"android:text="在线音乐"android:textStyle="bold"android:textSize="20sp"android:textColor="#000"android:gravity="center" /></LinearLayout>
//ViewPager是使视图滑动。
<android.support.v4.view.ViewPagerandroid:id="@+id/main_vp"android:layout_width="match_parent"android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>

如图示:

2.建立Fragment,布局
为了实现滑动,这里建立了两个Fragment,LocalFragment和OnlineFragment。
LocalFragment里的布局代码为:

//
<ListView
    android:id="@+id/local_listview"android:layout_width="match_parent"android:layout_height="match_parent"></ListView>

图示:
OnlineFragment里放置一个文本就行。
3.给LocalFragment建立适配器adapter(MusicListAdapter和)和实体类entity(Music)。
适配器MusicListAdapter代码:

public class MusicListAdapter extends BaseAdapter {//继承BaseAdapterprivate Context context;private List<Music> musicList;
public MusicListAdapter(List<Music> musicList,Context context){this.context=context;this.musicList=musicList;
}@Overridepublic int getCount() {return musicList.size();}@Overridepublic Object getItem(int i) {return null;}@Overridepublic long getItemId(int i) {return 0;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {View v;//ViewHolder为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。ViewHolder viewHolder = null;if(view==null) {v = LayoutInflater.from(context).inflate(R.layout.music_item_music, null);viewHolder=new ViewHolder();viewHolder.titleTV = v.findViewById(R.id.music_item_title);viewHolder.artistTV = v.findViewById(R.id.music_item_artist);viewHolder.albumImgview = v.findViewById(R.id.music_item_bmp);v.setTag(viewHolder);}else{v=view;viewHolder= (ViewHolder) v.getTag();//强制类型转换}Music music = musicList.get(i);//控件赋值viewHolder.titleTV.setText(music.title);viewHolder.artistTV.setText(music.artist+" - "+music.album);viewHolder.albumImgview.setImageBitmap(music.albumBmp);return v;}class ViewHolder{TextView titleTV;TextView artistTV;ImageView albumImgview;}
}

实体类Music代码:

public class Music {
//创建实体类public String title;public  String artist;public  String album;public Bitmap albumBmp;public  int length;
}

4.在Activity(MainActivity)里建立点击事件,用switch语句实现两个按钮的点击滑屏;
代码如下:


import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;import com.example.wyy.adapter.MusicPagerAdapter;
import com.example.wyy.fragment.LocalFragment;
import com.example.wyy.fragment.OnlineFragment;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener{private TextView localTV;
private TextView onlineTV;
private ViewPager viewPager;private List<Fragment>fragmentList=new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindID();//添加监听localTV.setOnClickListener(this);onlineTV.setOnClickListener(this);LocalFragment localFragment=new LocalFragment();OnlineFragment onlineFragment =new OnlineFragment();fragmentList.add(localFragment);fragmentList.add(onlineFragment);MusicPagerAdapter pagerAdapter =new MusicPagerAdapter(getSupportFragmentManager(),fragmentList);viewPager.setAdapter(pagerAdapter);}private void bindID() {localTV=findViewById(R.id.main_local_tv);onlineTV=findViewById(R.id.main_online_tv);viewPager=findViewById(R.id.main_vp);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.main_local_tv:viewPager.setCurrentItem(0);break;case R.id.main_online_tv:viewPager.setCurrentItem(1);break;default:break;}}
}

5.进入LocalFragment进行编写

-读取手机内的音乐文件(这里的代码只能实现Android6.0以下版本的手机)

public class LocalFragment extends Fragment {private ListView localListView;private MusicListAdapter adapter;private List<Music> musicList;private PermissionHelper permissionHelper;
private String TAG="LocalFragment";public LocalFragment() {// Required empty public constructor}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_local, container, false);initListview();localListView = view.findViewById(R.id.local_listview);private void initListview() {musicList = new ArrayList<>();//获取ContentResolver对象ContentResolver resolver = getContext().getContentResolver();//创建游标Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null, null, null, null);//游标归零cursor.moveToFirst();do {Music m = new Music();String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));//获取专辑IDint albumId = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));//根据专辑ID获取到专辑封面图m.albumBmp = getAlbumArt(albumId);m.title = title;m.album = album;m.artist = artist;musicList.add(m);} while (cursor.moveToNext());cursor.close();//关闭游标adapter = new MusicListAdapter(musicList, getActivity());localListView.setAdapter(adapter);
}}

在manifests包里的Androidmanifest.mxl里的 后面打入以下代码:

  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • Android6.0以上版本获取手机音乐权限方法
    在如图文件里加入 compile ‘com.master.android:permissionhelper:1.3’

    点击上面的show it,上图没有,已经实现了。

    然后在LocalFragment里实现获取音乐文件权限的方法

   permissionHelper = new PermissionHelper(this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);permissionHelper.request(new PermissionHelper.PermissionCallback() {@Overridepublic void onPermissionGranted() {initListview();//全都授权Log.e(TAG,"onPermissionGranted...");}@Overridepublic void onIndividualPermissionGranted(String[] grantedPermission) {//某个授权Log.e(TAG,"onIndividualPermissionGranted() called with: grantedPermission = [" + TextUtils.join(",",grantedPermission) + "]");}@Overridepublic void onPermissionDenied() {//某个拒绝Log.e(TAG,"onPermissionDenied...");}@Overridepublic void onPermissionDeniedBySystem() {//用户选择了"不再询问"后,点击"拒绝按钮",执行此方法Log.e(TAG,"onPermissionDeniedBySystem...");}});return view;}private Bitmap getAlbumArt(int album_id) {String mUriAlbums = "content://media/external/audio/albums";String[] projection = new String[]{"album_art"};Cursor cur = getActivity().getContentResolver().query(Uri.parse(mUriAlbums + "/" + Integer.toString(album_id)), projection, null, null, null);String album_art = null;if (cur.getCount() > 0 && cur.getColumnCount() > 0) {cur.moveToNext();album_art = cur.getString(0);}cur.close();Bitmap bm = null;if (album_art != null) {bm = BitmapFactory.decodeFile(album_art);} else {bm = BitmapFactory.decodeResource(getResources(), R.mipmap.default_cover);}return bm;}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (permissionHelper != null) {permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);}}

代码中的 initListview();,本来在方法外的,所以把之前的删除。
7.创建一个Activity(Main2Activity),给它布局;
代码如下:

<?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="com.example.wyy.Main2Activity"><RelativeLayout
        android:layout_width="match_parent"android:layout_height="60dp"android:background="#bc0404"><TextView
        android:id="@+id/main2_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textStyle="bold"android:textColor="#000000"android:text="歌名"android:textSize="25dp"android:layout_centerHorizontal="true"/><TextView
        android:id="@+id/main2_artist"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/main2_title"android:textStyle="bold"android:text="歌名"android:textSize="20dp"android:layout_centerHorizontal="true"/></RelativeLayout>
</RelativeLayout>

如图:

8.下面实现Fragment和Acivity之间的跳转和传值;
在LocalFragment里建立Item点击事件:

  localListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {Intent intent =new Intent(getActivity(), Main2Activity.class);//实现页面跳转//传值intent.putExtra("title",musicList.get(i).title);intent.putExtra("artist",musicList.get(i).artist);intent.putExtra("album",musicList.get(i).album);getActivity().startActivity(intent);}});

然后在Main2Activity里获取Intent和信息

package com.example.wyy;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;public class Main2Activity extends Activity {private TextView titleTV;
private TextView artistTV;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);bingID();Intent intent=getIntent();String title =intent.getStringExtra("title");String artist =intent.getStringExtra("artist");String album =intent.getStringExtra("album");titleTV.setText(title);artistTV.setText(artist+"--"+album);}private void bingID() {titleTV=findViewById(R.id.main2_title);artistTV=findViewById(R.id.main2_artist);}
}

成果如图:

这样就完成了,虽然还是个半成品,但在下面的两周实训课,我会把这个音乐播放器做的很出色的,加油!

音乐播放器从0到读取手机内的音乐文件——Android Studio小白实训笔记相关推荐

  1. 迷你音乐播放器v1.0正式上线!

    迷你音乐播放器V1.0正式上线! 版本介绍: 1.随机播放切换开关(通过点击专辑图片) 2.通过拖动歌曲名及艺术家名调整歌曲播放进度 3.手机浏览访问支持熄屏播放 4.暂不支持在线搜索功能 快来一起分 ...

  2. Flash版(迷你音乐播放器mp3Player1.0 Beta1 )附源码

    迷你音乐播放器mp3Player1.0 Beta1  ================= //What's new: 主要功能特色: 1.支持歌曲名称,歌手名称以及专辑等关键字搜索. 2.支持随机搜索 ...

  3. php项目网页音乐播放器插件,10个免费开源的JS音乐播放器插件

    10个免费开源的JS音乐播放器插件 三月 24, 2015 评论 (3) Sponsor 音乐播放器在网页设计中有时候会用到,比如一些时尚类.音乐或影视类等项目,但这些网页播放器插件比较少见,所以这里 ...

  4. 画出android音乐播放器的类图,基于Qt图形框架音乐播放器的设计与实现

    随着互联网软件行业的快速发展,应用市场的软件种类更是琳琅满目,其中,生活娱乐类的软件种类最为繁多,就以本文涉及到的音乐播放器(多媒体)来说,国内目前的主流音乐播放器有QQ音乐.酷狗音乐.百度音乐.网易 ...

  5. C#开源音乐播放器MetroPlayer3.0发布

      一.说明 MetroPlayer3.0是在MetroMusic1.05及2.0版本的基础之上,进行重构和改进的软件产品.从3.0开始,本软件正式更名为MetroPlayer.MetroPlayer ...

  6. 安卓实训项目:音乐播放器3.0——实训报告3

    一.功能要求 在基于存储卡音乐播放器V0.2基础上,增加功能: 添加一个音乐播放列表(显示歌名) – 单击某一首音乐就立刻播放,播放进度清零,显示当前音乐的播放时长. 添加一个[上一首]与[下一首]按 ...

  7. 安卓实训项目:音乐播放器2.0——实训报告2

    (一)功能要求 添加一个进度条,动态显示音乐的播放进度.----已完成 添加一个标签显示音乐播放的当前位置(格式--mm:ss).----已完成 添加一个标签显示音乐的播放时长(格式--mm:ss). ...

  8. Android Studio实现音乐播放器2.0

    项目目录 一.引言 二.项目概述 1.需求分析 2.设计分析 3.资源文件分析 三.开发环境 四.优化设计 1.上一首下一首 2.个性化按钮 五.运行效果 六.项目总结 七.源码获取 一.引言 我在一 ...

  9. 音乐播放器android-1.0

    音乐播放的基本功能都已实现 1.概述 1.1.简介 1.2.音乐文件 2.功能 2.1.登录 2.2.注册 2.3.记住用户 2.4.播放,暂停,上一首,下一首 2.5.自动播放下一首 2.6.进度条 ...

最新文章

  1. 山东省第三届数据应用赛事来了!
  2. 2011最有用最潮的jQuery特效教程,前端们抱走吧~
  3. CoordinatorLayout与滚动的处理
  4. 普211标准三维EE零基础转CS申
  5. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)
  6. VTK:可视化之MovableAxes
  7. JWT令牌创建和解析讲解
  8. jax-rs jax-ws_快速浏览JAX-RS请求与方法匹配
  9. 山东省德州市有哪些明星?
  10. HLSL内置函数一览
  11. Android学习——LitePal源码分析
  12. CodeM2018复赛
  13. 我的大学生涯软件工程一年半
  14. matlab iri模型,IRI-2016 Matlab 使用教程
  15. CRMEB Min电商系统商城源码 v4.3.2
  16. POJ2126 多项式分解定理
  17. 教你使用Python爬虫获取电子书资源实战!喜欢学习的小伙伴过来看啦!
  18. android10获取手机号码,【android,10】10.调用web服务获取手机号码归属地
  19. R语言计算相关性和p-values
  20. 22.4.2_mysql自动生成日期表(按年份)

热门文章

  1. python fsolve说明_Python scipy fsolve“’func’参数的输入和输出...
  2. 同济大学2020计算机复试线,2020同济大学研究生考研复试分数线
  3. 百度李彦宏 鼓励狼性,淘汰小资
  4. WebGL简易教程(一):第一个简单示例
  5. SuperMap iClient3D for WebGL教程(空间分析)- 地表开挖及修改
  6. 2W 字详解 Redis 集群环境搭建实践
  7. 原生JS随机抽取号码
  8. 三维交通模拟html,交通事故三维模拟软件
  9. iOS在GitHub Top 前100 简介
  10. H264学习(二)编码方法和编码工具简介