热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

AndroidStudio实现音乐播放器

Androidstudio音乐播放器,供大家参考,具体内容如下 实现目的:利用广播在myapplication中原本button点我暂停按

Androidstudio音乐播放器,供大家参考,具体内容如下

实现目的:利用广播在myapplication中原本button点我暂停按钮是灰色无法点击的,此时发送一条短信给自己的安卓手机,按钮变成黑色,音乐开始播放,此时点击 点我暂停 按钮,音乐停止。

结果截图:

发送短信给自己后:,点我暂停 按钮变成黑色,并开始播放音乐:

此时点击点我暂停按钮,音乐暂停

广播

Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息,这与发布-订阅设计模式相似。这些广播会在所关注的事件发生时发送。举例来说,Android 系统会在发生各种系统事件时发送广播,例如系统启动或设备开始充电时。再比如,应用可以发送自定义广播来通知其他应用它们可能感兴趣的事件(例如,一些新数据已下载)。
广播消息本身会被封装在一个Intent对象中,该对象的操作字符串会标识所发生的事件(例如 android.intent.action.AIRPLANE_MODE )。该 Intent 可能还包含绑定到其 extra 字段中的附加信息。例如,飞行模式 intent 包含布尔值 extra 来指示是否已开启飞行模式。

xml文件

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 

mainactivity.java文件

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

 private Button btnStop;
 private boolean isCast; //是否为广播激活

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){
   ActivityCompat.requestPermissions(this,new String[]{"android.permission.RECEIVE_SMS"},1);
  }
  btnStop=findViewById(R.id.btnStop);
  Intent intent = getIntent(); //获取广播意图对象
  isCast = intent.getBooleanExtra("iscast", false); //默认值为false
  btnStop.setEnabled(isCast); //设置停止按钮可用和单击监听
  if(isCast) Toast.makeText(this, "正在播放音乐...", Toast.LENGTH_SHORT).show();
  btnStop.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v){
    //显式服务调用意图(非绑定式)
    Intent intent=new Intent(MainActivity.this, MyAudioService.class);
    //在Activity组件里,停止音乐播放服务
    stopService(intent);
    isCast=false;
    btnStop.setEnabled(isCast);
//    finish(); //销毁本活动
   }
  });
 }
 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  switch (requestCode){
   case 1:
    if(grantResults[0]!=PackageManager.PERMISSION_GRANTED){
     Toast.makeText(this, "未授权,无法实现预定的功能!", Toast.LENGTH_SHORT).show();
     finish();
    }else{
     Toast.makeText(this, "请发一条短信验证...", Toast.LENGTH_SHORT).show();
    }
  }
 }
}

SmsReceiver.java文件

编写广播接收者程序

package com.example.myapplication;

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

/*
 本广播接收者程序分别调用了应用的主Activity程序和播放音乐的服务程序
*/
public class SmsReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {

  Intent serviceIntent = new Intent(context, MyAudioService.class);
  //在广播组件里,通过上下文对象启动音乐播放服务组件
  context.startService(serviceIntent);

  //新建调用Activity组件的意图
  Intent activityIntent = new Intent(context, MainActivity.class);
  activityIntent.putExtra("iscast", true); //携带数据
  //新建栈用来存放被启动的Activity(当已经存在时,只做移动处理)
  activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  //在广播组件里,通过上下文对象启动Activity组件
  context.startActivity(activityIntent);
 }
}

MyAudioService.java文件

package com.example.myapplication;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;


public class MyAudioService extends Service {
 MediaPlayer mediaPlayer;

 @Override
 public IBinder onBind(Intent intent) {
  return null;
 }
 @Override
 public void onCreate() {
  mediaPlayer = MediaPlayer.create(this, R.raw.liyue);//创建音乐服务。播放R.raw中的音乐liyue
  mediaPlayer.start();//开始服务
 }
 @Override
 public void onDestroy() {
  mediaPlayer.stop();
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Vue 2 中解决页面刷新和按钮跳转导致导航栏样式失效的问题
    本文介绍了如何通过配置路由的 meta 字段,确保 Vue 2 项目中的导航栏在页面刷新或内部按钮跳转时,始终保持正确的 active 样式。具体实现方法包括设置路由的 meta 属性,并在 HTML 模板中动态绑定类名。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
author-avatar
手机用户2502879747
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有