Android Studio實(shí)現(xiàn)音樂(lè)播放器
Androidstudio音樂(lè)播放器,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)目的:利用廣播在myapplication中原本button點(diǎn)我暫停按鈕是灰色無(wú)法點(diǎn)擊的,此時(shí)發(fā)送一條短信給自己的安卓手機(jī),按鈕變成黑色,音樂(lè)開始播放,此時(shí)點(diǎn)擊 點(diǎn)我暫停 按鈕,音樂(lè)停止。
結(jié)果截圖:
發(fā)送短信給自己后:,點(diǎn)我暫停 按鈕變成黑色,并開始播放音樂(lè):
此時(shí)點(diǎn)擊點(diǎn)我暫停按鈕,音樂(lè)暫停
廣播
Android 應(yīng)用與 Android 系統(tǒng)和其他 Android 應(yīng)用之間可以相互收發(fā)廣播消息,這與發(fā)布-訂閱設(shè)計(jì)模式相似。這些廣播會(huì)在所關(guān)注的事件發(fā)生時(shí)發(fā)送。舉例來(lái)說(shuō),Android 系統(tǒng)會(huì)在發(fā)生各種系統(tǒng)事件時(shí)發(fā)送廣播,例如系統(tǒng)啟動(dòng)或設(shè)備開始充電時(shí)。再比如,應(yīng)用可以發(fā)送自定義廣播來(lái)通知其他應(yīng)用它們可能感興趣的事件(例如,一些新數(shù)據(jù)已下載)。
廣播消息本身會(huì)被封裝在一個(gè)Intent對(duì)象中,該對(duì)象的操作字符串會(huì)標(biāo)識(shí)所發(fā)生的事件(例如 android.intent.action.AIRPLANE_MODE )。該 Intent 可能還包含綁定到其 extra 字段中的附加信息。例如,飛行模式 intent 包含布爾值 extra 來(lái)指示是否已開啟飛行模式。
xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/loading"> <Button android:text="BUTTON" android:layout_marginTop="@android:dimen/app_icon_size" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:onClick="send"/> </LinearLayout>
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(); //獲取廣播意圖對(duì)象 isCast = intent.getBooleanExtra("iscast", false); //默認(rèn)值為false btnStop.setEnabled(isCast); //設(shè)置停止按鈕可用和單擊監(jiān)聽 if(isCast) Toast.makeText(this, "正在播放音樂(lè)...", Toast.LENGTH_SHORT).show(); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v){ //顯式服務(wù)調(diào)用意圖(非綁定式) Intent intent=new Intent(MainActivity.this, MyAudioService.class); //在Activity組件里,停止音樂(lè)播放服務(wù) stopService(intent); isCast=false; btnStop.setEnabled(isCast); // finish(); //銷毀本活動(dòng) } }); } @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, "未授權(quán),無(wú)法實(shí)現(xiàn)預(yù)定的功能!", Toast.LENGTH_SHORT).show(); finish(); }else{ Toast.makeText(this, "請(qǐng)發(fā)一條短信驗(yàn)證...", Toast.LENGTH_SHORT).show(); } } } }
SmsReceiver.java文件
編寫廣播接收者程序
package com.example.myapplication; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; /* 本廣播接收者程序分別調(diào)用了應(yīng)用的主Activity程序和播放音樂(lè)的服務(wù)程序 */ public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(context, MyAudioService.class); //在廣播組件里,通過(guò)上下文對(duì)象啟動(dòng)音樂(lè)播放服務(wù)組件 context.startService(serviceIntent); //新建調(diào)用Activity組件的意圖 Intent activityIntent = new Intent(context, MainActivity.class); activityIntent.putExtra("iscast", true); //攜帶數(shù)據(jù) //新建棧用來(lái)存放被啟動(dòng)的Activity(當(dāng)已經(jīng)存在時(shí),只做移動(dòng)處理) activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //在廣播組件里,通過(guò)上下文對(duì)象啟動(dòng)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);//創(chuàng)建音樂(lè)服務(wù)。播放R.raw中的音樂(lè)liyue mediaPlayer.start();//開始服務(wù) } @Override public void onDestroy() { mediaPlayer.stop(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)簡(jiǎn)單的音樂(lè)播放器
- Android?Studio實(shí)現(xiàn)音樂(lè)播放器2.0的全過(guò)程
- Android?Studio實(shí)現(xiàn)音樂(lè)播放器的全過(guò)程(簡(jiǎn)單易上手)
- Android實(shí)現(xiàn)簡(jiǎn)易的音樂(lè)播放器
- Android開發(fā)簡(jiǎn)易音樂(lè)播放器
- android實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器
- Android實(shí)現(xiàn)音樂(lè)播放器鎖屏頁(yè)
- Android音樂(lè)播放器簡(jiǎn)單實(shí)現(xiàn)案例
相關(guān)文章
解決EditText不顯示光標(biāo)的三種方法(總結(jié))
下面小編就為大家?guī)?lái)一篇解決EditText不顯示光標(biāo)的三種方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Kotlin淺析延遲初始化與密封類的實(shí)現(xiàn)方法
Kotlin語(yǔ)言的許多特性,包括變量不可變,變量不可為空,等等。這些特性都是為了盡可能地保證程序安全而設(shè)計(jì)的,但是有些時(shí)候這些特性也會(huì)在編碼時(shí)給我們帶來(lái)不少的麻煩,下面我們來(lái)了解延遲初始化和密封類的特點(diǎn)2022-08-08Android中如何實(shí)現(xiàn)清空搜索框的文字
本文主要介紹Android中實(shí)現(xiàn)清空搜索框的文字的方法。項(xiàng)目中的有關(guān)搜索的地方,加上清空文字的功能,目的是為了增加用戶體驗(yàn),使用戶刪除文本更加快捷。需要的朋友一起來(lái)看下吧2016-12-12android仿音悅臺(tái)頁(yè)面交互效果實(shí)例代碼
這篇文章主要介紹了android 仿音悅臺(tái)頁(yè)面播放效果實(shí)例代碼,新版的音悅臺(tái) APP 播放頁(yè)面交互非常有意思,可以把播放器往下拖動(dòng),然后在底部懸浮一個(gè)小框,還可以左右拖動(dòng)。2017-01-01Android使用Circular Reveal動(dòng)畫讓頁(yè)面跳轉(zhuǎn)更炫酷
本篇文章主要介紹了Android使用Circular Reveal動(dòng)畫讓頁(yè)面跳轉(zhuǎn)更炫酷,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Android適配器Adapter與ListView和RecycleView的簡(jiǎn)單使用
本文將為大家介紹Android開發(fā)中常用的適配器(Adapter)概念,以及ListView和RecycleView的簡(jiǎn)單使用方法,需要的朋友可以參考下2023-05-05