Andriod studio 学习 之 使用MediaPlayer+Service+Broadcast完成音乐播放器

手把手教你搭建一个属于自己的网站-适合零基础小白,文末附网站模板 手把手教你搭建一个属于自己的网站-适合零基础小白写在前面搭建需求功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 写在前面 前段时间休息想着搭一个属于自己的网站,几经尝试终于成功了,网上其实有很多教程,但很多,希望这篇文章能够帮助到 阅读详情
使用MediaPlayer+Service+Broadcast完成音乐播放器

1,封装歌曲的类

package com.example.service_broadcast_music;

public class Song {
    private String title;
    private String artist;
    private int duration;
    private String data;
    private int size;

    public Song(String title, String artist, int duration, String data, int size) {
        this.title = title;
        this.artist = artist;
        this.duration = duration;
        this.data = data;
        this.size = size;
    }

    public Song() {
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public int getDuration() {
        return duration;
    }

    public void setDuration(int duration) {
        this.duration = duration;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}

2 读取所有的歌曲

package com.example.service_broadcast_music;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;

import java.util.ArrayList;
import java.util.List;

public class Utils {
    private Context context;
    private List<Song> list;

    public Utils(Context context, List<Song> list) {
        this.context = context;
        this.list = list;
    }
    public static List<Song> init(Context context){
        List<Song> list=new ArrayList<>();
        Uri uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        String[] strings={MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.SIZE};
        ContentResolver contentResolver = context.getContentResolver();
        Cursor cursor = contentResolver.query(uri, strings, null, null, null);
        while (cursor.moveToNext()){
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            int duration = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
            String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            int size = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));
            Song song = new Song(title,artist,duration,data,size);
            list.add(song);
        }
        cursor.close();
        return list;
    }
}

3 创建listview布局适配器

package com.example.service_broadcast_music;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

public class Myadpater extends BaseAdapter {
    private Context context;
    private List<Song> list;

    public Myadpater(Context context, List<Song> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Viewholder viewholder;
        if (convertView==null){
            convertView = LayoutInflater.from(context).inflate(R.layout.layout, null);
            viewholder=new Viewholder();
            viewholder.title=convertView.findViewById(R.id.titleid);
            viewholder.artist = convertView.findViewById(R.id.artistid);
            viewholder.duration=convertView.findViewById(R.id.durationid);
            convertView.setTag(viewholder);
        }else {
            viewholder = (Viewholder) convertView.getTag();
        }
        viewholder.title.setText(list.get(position).getTitle());
        viewholder.artist.setText(list.get(position).getArtist());
        int time = list.get(position).getDuration();
        String s = formatTime(time);
        viewholder.duration.setText(s);
        return convertView;
    }
    class Viewholder{
        TextView title;
        TextView artist;
        TextView duration;
    }
    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;
        }
    }
}

4 service中的代码

package com.example.service_broadcast_music;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.widget.RemoteViews;

import java.io.IOException;
import java.util.List;

public class MyService extends Service {
    private MediaPlayer mediaPlayer;
    private List<Song> list;
    private int index;
    private Notification.Builder builder;
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return new Musicbiner();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mediaPlayer = new MediaPlayer();
        list = Utils.init(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        NotificationManager manager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        builder=new Notification.Builder(this);
        builder.setSmallIcon(R.mipmap.dog);


        //自定义广播中的布局
        RemoteViews views = new RemoteViews(getPackageName(),R.layout.activity_main);

        Intent intent1 = new Intent();
        intent1.setAction("com.notify.stop");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 800, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.stopid,pendingIntent);

        Intent intent2 = new Intent();
        intent1.setAction("com.notify.continue");
        PendingIntent pendingIntent2 = PendingIntent.getBroadcast(this, 810, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.continueid,pendingIntent2);

        Intent intent3 = new Intent();
        intent1.setAction("com.notify.back");
        PendingIntent pendingIntent3 = PendingIntent.getBroadcast(this, 820, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.backid,pendingIntent3);

        Intent intent4 = new Intent();
        intent1.setAction("com.notify.next");
        PendingIntent pendingIntent4 = PendingIntent.getBroadcast(this, 830, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
        views.setOnClickPendingIntent(R.id.nextid,pendingIntent4);

        //设置通知的布局
        builder.setCustomContentView(views);
        //开始一个前台服务
        startForeground(1,builder.build());
        return  super.onStartCommand(intent,flags,startId);

    }

    public class Musicbiner extends Binder{
        public void callplay(int position){
            playsong(position);
            index=position;
        }
        public void callpause(){
            pause();
        }
        public void callcontinue(){
            playcontinue();
        }
        public void callnextsong(){
            if (++index>list.size()-1){
                index=0;
            }
            playsong(index);
        }
        public void callbacksong(){
            if (--index<0){
                index=0;
            }
            playsong(index);
        }
    }

    private void playcontinue() {
        mediaPlayer.start();
    }


    private void pause() {
        if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();
        }
    }

    private void playsong(int position){
        if (mediaPlayer.isPlaying()){
            mediaPlayer.stop();
        }
        //重置
        mediaPlayer.reset();
        //找到位置
        Song song = list.get(position);
        try {
            mediaPlayer.setDataSource(song.getData());
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

5 service中通知的布局文件

<?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=".MainActivity">
    <ListView
        android:id="@+id/listid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

    <LinearLayout
        android:gravity="center"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/continueid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="继续播放"
            />
        <Button
            android:id="@+id/stopid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="暂停播放"
            />
        <Button
            android:id="@+id/backid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="上一首"
            />
        <Button
            android:id="@+id/nextid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="下一首"
            />
    </LinearLayout>


</RelativeLayout>

6 广播的内容

package com.example.service_broadcast_music;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {

    private static final String TAG = "MyReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Log.i(TAG, "onReceive: "+action);
        if (action.equals("com.notify.stop")){
            MainActivity.handler.sendEmptyMessage(110);
        }else if (action.equals("com.notify.continue")){
            MainActivity.handler.sendEmptyMessage(120);
        }else if (action.equals("com.notify.back")){
            MainActivity.handler.sendEmptyMessage(130);
        }else if (action.equals("com.notify.next")){
            MainActivity.handler.sendEmptyMessage(140);
        }
    }
}

7 MainActivity中的代码

package com.example.service_broadcast_music;

import android.Manifest;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ListView listid;
    private Button continueid;
    private Button stopid;
    private Button backid;
    private Button nextid;
    private List<Song> list;
    private ServiceConnection connection;
    private static MyService.Musicbiner biner;
    private Myadpater myadpater;
    private static final String TAG = "MainActivity";
    public static Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.i(TAG, "handleMessage: "+msg.what);
            if (msg.what==110){
                biner.callpause();
            }else if (msg.what==120){
                biner.callcontinue();
            }else if (msg.what==130){
                biner.callbacksong();
            }else if (msg.what==140){
                biner.callnextsong();
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewinit();

        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},101);
        }

        listid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                biner.callplay(position);
            }
        });

        Intent intent = new Intent(this,MyService.class);
        startService(intent);
         connection=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                biner=(MyService.Musicbiner)service;
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
         bindService(intent,connection, Service.BIND_AUTO_CREATE);
    }

    private void viewinit() {
        listid = (ListView) findViewById(R.id.listid);
        continueid = (Button) findViewById(R.id.continueid);
        continueid.setOnClickListener(this);
        stopid = (Button) findViewById(R.id.stopid);
        stopid.setOnClickListener(this);
        backid = (Button) findViewById(R.id.backid);
        backid.setOnClickListener(this);
        nextid = (Button) findViewById(R.id.nextid);
        nextid.setOnClickListener(this);

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.notify.stop");
        intentFilter.addAction("com.notify.continue");
        intentFilter.addAction("com.notify.back");
        intentFilter.addAction("com.notify.next");
        MyReceiver myReceiver = new MyReceiver();
        registerReceiver(myReceiver,intentFilter);
    }
    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id){
            case R.id.stopid:
                biner.callpause();
                break;
            case R.id.continueid:
                biner.callcontinue();
                break;
            case R.id.nextid:
                biner.callnextsong();
                break;
            case R.id.backid:
                biner.callbacksong();
                break;
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode==101&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
            List<Song> init = Utils.init(this);
            myadpater = new Myadpater(this, init);
            listid.setAdapter(myadpater);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (connection!=null){
            unbindService(connection);
        }
    }
}

8 MainActivity中的布局

<?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=".MainActivity">
    <ListView
        android:id="@+id/listid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

    <LinearLayout
        android:gravity="center"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/continueid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="继续播放"
            />
        <Button
            android:id="@+id/stopid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="暂停播放"
            />
        <Button
            android:id="@+id/backid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="上一首"
            />
        <Button
            android:id="@+id/nextid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="下一首"
            />
    </LinearLayout>


</RelativeLayout>

9 listView的布局文件

<?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">

    <LinearLayout
        android:layout_weight="1"
        android:layout_width="0dp"
        android:orientation="vertical"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/titleid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是歌名"
            android:layout_margin="10dp"
            />
        <TextView
            android:id="@+id/artistid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是歌手"
            android:layout_margin="10dp"
            />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="78dp"
        android:layout_weight="0.5"
        android:gravity="center">

        <TextView
            android:id="@+id/durationid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:text="我是时长" />
    </LinearLayout>
</LinearLayout>

10 清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.service_broadcast_music">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <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">
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true"></receiver>

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
相机标定原理与张氏标定法 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar 阅读详情

相关推荐

Drugbank XML文件解析

DrugBank Release Version 5.1.13 | DrugBank Online点击download下载XML文件,也可以使用COMMAND命令下载。(下载文件需要先注册一个账号文件,就可以下载了)下载好压缩文件,并解压会得到如下两个文件:full database.xml就是我们所需要的XML文件,完整的XML很大,大约为1.6G因为原始的文件非常大,直接查看XML文件是有困难的,所以我们使用一下命令来查看该文件的前一百行 得到如下输出 对于前三行 第一行:表示XML 版本为 1.0

qtjbzs的博客 584

基于XMPP协议的Android即时通信系

这段时间公司要做基于XMPP协议的聊天社交软件,提前学了些。搜了些资料,总结了一下。发出来。       设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务器作为即时通讯平台。          系统主要由以下部分组成:一是服务器,负责管理发出的连接或者与其他实体的会话,接收或转发XML(ExtensibleM

老牛比 18万+

M2DGR数据集在主流SLAM框架中的实战配置指南:从ORB-SLAM到FAST-LIO的完整流程

本文提供了M2DGR多传感器数据集在主流SLAM框架中的实战配置指南。详细介绍了从ORB-SLAM、VINS-Mono等视觉/视觉惯性框架,到A-LOAM、FAST-LIO等激光/激光惯性框架的完整配置流程、参数调整要点及常见问题解决方案。通过实际测试对比,分析了各算法在M2DGR数据集上的表现,为机器人定位与建图研究提供了宝贵的实战经验。

k9l0m1的博客 481

产品设计之路:软件开发之【时间估算】

“这个功能相当简单,所有你需要做的就是完成X,Y,Z。这个应该不难吧”听到这些话是,我非常气愤,而且说这些话的人几乎都是跟技术不沾边的人,或正在研究他们的第一个产品。想想他们在跟谁辩论软件开发所需要的时间?但后来我意识到,即使我自己对自己的项目预测要花去多少开发时间,我也是一筹莫展。如果连我自己都做不好,我何必对那些人恼怒呢?   真正郁闷的不是他们预估的错误。问题在于他们竟然认为自己可以做...

www.jiav.net技术网站的加盟博客 316

【YOLO 系列】基于YOLO V8的智能车载交通标志识别系统【python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍了基于YOLO V8构建智能车载交通标志识别系统的完整流程。从环境搭建、数据集准备、模型训练到PyQt5图形界面开发,提供了Python源码和实战代码,帮助开发者快速实现高精度、实时的交通标志检测应用,提升驾驶辅助系统的开发效率。

wdx012345的博客 966

YOLOv8改进——引入可变形卷积DCNv3

本文只讲解在YOLOv8的代码中添加DCNv3的操作流程, 具体的原理参见上述的链接~是pytorch实现的版本,只要基础的pytorch环境安装正确就不会出错。是C++实现版本,必须先在上一步编译成功,或者安装好了轮子,否则会报错。但是在实际的训练过程中,C++版本的运行速度更快,推荐使用C++版本。(具体怎么修改,都可以自己决定,然后通过实验看看效果如何)文件夹,该文件夹下的内容就是实现DCNv3算子的核心代码。中,下图中的列表里添加。

zyw2002的博客 3万+

19个免费的ppt制作网站

免费ppt制作网站

HH112586的博客 1228万+

ACM论文LaTeX模板解析(三)| 文章顶部信息(Top matter))Part 1

文章顶部信息(Top matter))Part 1,文章类型、作者信息等

FreshManInC的博客 4853

菠萝蜜\菠萝蜜和榴莲有什么区别?

菠萝蜜和榴莲的区别   菠萝蜜富含糖类、B族维生素、维生素C、钙、锌、铁等有益成分,有“热带水果皇后”之称,在隋唐时从印度传入中国。榴莲原产自马来西亚,盛产于泰国,含有丰富的糖类、膳食纤维、维生素A、维生素B、维生素C、钙、铁、磷等多种营养素,被称作“水果之王”。榴莲和菠萝蜜的区别有从以下几个方面:   1、味道   购买的时候,只要闻一下气味,就能很快区分菠萝蜜和榴莲。除了特殊

少年休闲海 2627

【Mode】微带传输线阻抗

微带线,英文名称为 (Microstrip) 是一种常见的平面传输线,主要用于传输微波频率信号(通常在射频和微波电路重中使用)。

u011699626的博客 243

Qt(C++)使用QChart动态显示3个设备的温度变化曲线

Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。

1916

android 仿QQ聊天,带表情,可翻页,带翻页拖动缓冲

如题,这是公司项目的一个功能模块,先上个效果图: 其次大致说说原理: 1,首先判断输入的字符,是否包含表情的文字,比如 这个表情对应的文件名为emoji_1.png,它对应的文字描述 :[可爱],如果我们在输出的是输出这么一句话:老婆,我想你了。 那么我们对应的根本文字就是:老婆,我想你了[可爱]。 2,具体的转换过程就是用正则表达式比配文字中是否含有[xxx]这类的文字,如果有...

www.jiav.net技术网站的加盟博客 453

STM32H750VB与AD5292通讯,写入阻值后,AD5292 的阻值没有变化,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1098

关于MediaPlayer播放,Service服务,Notification使用,Broadcast设置,EventBus原理简单分析

创建MediaPlayer类,音频地址url当参数传入,setDataSource(url) 获取地址对应资源prepare() 同步为播放器的回放做准备prepareAsync()异步地为播放器的回放做准备。设置数据源和显示表面之后,需要调用prepare()或prepareAsync()。对于流,应该调用prepareAsync(),它会立即返回,而不是阻塞,直到缓冲了足够的数据。start() 开启音乐stop()暂停音乐音乐资源一加载好自动播放的接口。

zhoujun798的博客 351

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【无标题】

ImageNet中文标签

qq_38355184的博客 1254

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

一个不错的选色网站

http://0to255.com/ 转载于:https://www.cnblogs.com/sofire/archive/2010/10/12/1849141.html

weixin_33890526的博客 96万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android学习之--腾讯云直播

day16:腾讯云直播 一. 原理: 二.登陆官网 三.查看官方文档 1.打开文档 2.SDK集成 选择第一种即可 3.主播推流 4.观众拉流 四.测试: 1.打开控制台 2.云直播产品 3.域名管理 推流域名 4.流管理:直播推流之后就有在线流,显示直播中 五.主播已经把流推上去了,接下来就是拉流,拉流地址点击上面的测试按钮显示拉流地址 六.代码: 1.推流: 2.拉流 一. 原理: 主播:推流...

菠萝菠萝蜜的博客 1367

比较App版本大小

// 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0 public static int compareVersion(String version1, String version2) { if (version1 == null || version2 == null) { return -1; } String[] ver...

xy8199的博客 1196

Android APP架构的那点事儿[网络模块]

So,我们首先来规划一下网络模块的代码基本结构网络模块的基本职责就是构建请求参数、请求服务器、响应服务器、加解密。UML图中,我们定义的了一个接口类,主要提供客户端访问服务器的预设的一些接口函数。当MVP架构的Presenter指示器调用网络请求入口类(NetworkController)函数时,NetworkController 只需调用 NetworkInterface 中对应的接口函数,无需

老牛比 6805

app平台搭建

ssm+idea 在idea中创建好项目以后 配置pom.xml 时常刷新 1.环境搭建 1.设置版本插件 <properties> <project.build.sourceEncoding> UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8&...

weixin_44637905的博客 3万+

直播APP开发:直播的广告效益和号召力分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34007291的博客 2649

Android学习之----SurfaceView添加MediaPlayer实现视频播放和弹幕滚动

package com.example.app3; import android.media.MediaPlayer; import android.os.Bundle; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import android.view.L...

菠萝菠萝蜜的博客 801

Android之基于XMPP协议即时通讯软件(三)

优快云博客之星投票请移驾:http://vote.blog.youkuaiyun.com/blogstaritem/blogstar2013/weidi1989 本文主要介绍本应用的控制层具体实现。如需了解项目结构与框架,请移步之前系列文章: Android之基于XMPP协议即时通讯软件(一) Android之基于XMPP协议即时通讯软件(二) 另外,本项目已经升级到V1

way 2万+

解决全网 99的视频下载问题

总会有那么一些视频和电影,我们想保存到本地反复观摩。 今天我们就来聊聊视频下载的问题,预计能解决99%的视频下载问题,而且绝对简单,隔壁老大爷也能学会。 本文可能是目前最全的视频下载教程,也可能是最长久有效的。 一、视频下载的原理 首先,我们来讲一讲视频下载的原理。不然,就算你被安利再多的“万能视频下载器”,也是徒然。 有时候,我们下载下来的视频是分段的,是网站为了防止别人下载,故意这么做的吗? 不是的! 将视频分成多个片段,为的是解决视频的缓冲问题。它可以让我们不用等到整个视频都缓...

乌龟的专栏 1万+

Andriod studio 学习 之 MediaPlayer+Service完成音乐播放器

使用MediaPlayer+Service完成音乐播放器 1,先把歌曲封装成一个类 package com.example.servicemusic; public class Song { private String title; private String artist; private int duration; private String data;...

Young_cloud的博客 668

美国云服务器推荐排行榜TOP10

此外,OVHcloud还提供了全面的技术支持和丰富的开发工具,帮助用户轻松构建和管理自己的云环境。此外,恒创科技还提供了丰富的网络、存储和安全服务,使用户能够轻松构建和管理自己的云基础设施。此外,Azure还提供了一系列的企业级服务,如数据库、数据分析和人工智能等,适合大型企业和需要高度安全性的应用场景。IBM提供了多种云服务器实例和存储解决方案,以及一系列的企业级服务,如数据库、数据分析和人工智能等。此外,GCP还提供了丰富的数据存储、分析和人工智能服务,使您能够充分利用谷歌的技术优势。

恒创科技Henghost 1246
上一篇: Andriod studio 学习 之 MediaPlayer+Service完成音乐播放器
下一篇: Andriod studio 学习 之 Listview中实现隐藏和显示多选框 实现全选,取消全选,反选,删除
Young_cloud
博客等级 码龄7年 18粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值