Android Studio實(shí)現(xiàn)音樂播放器
Androidstudio音樂播放器,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)目的:利用廣播在myapplication中原本button點(diǎn)我暫停按鈕是灰色無法點(diǎn)擊的,此時發(fā)送一條短信給自己的安卓手機(jī),按鈕變成黑色,音樂開始播放,此時點(diǎn)擊 點(diǎn)我暫停 按鈕,音樂停止。
結(jié)果截圖:
發(fā)送短信給自己后:,點(diǎn)我暫停 按鈕變成黑色,并開始播放音樂:



此時點(diǎn)擊點(diǎn)我暫停按鈕,音樂暫停
廣播
Android 應(yīng)用與 Android 系統(tǒng)和其他 Android 應(yīng)用之間可以相互收發(fā)廣播消息,這與發(fā)布-訂閱設(shè)計模式相似。這些廣播會在所關(guān)注的事件發(fā)生時發(fā)送。舉例來說,Android 系統(tǒng)會在發(fā)生各種系統(tǒng)事件時發(fā)送廣播,例如系統(tǒng)啟動或設(shè)備開始充電時。再比如,應(yīng)用可以發(fā)送自定義廣播來通知其他應(yīng)用它們可能感興趣的事件(例如,一些新數(shù)據(jù)已下載)。
廣播消息本身會被封裝在一個Intent對象中,該對象的操作字符串會標(biāo)識所發(fā)生的事件(例如 android.intent.action.AIRPLANE_MODE )。該 Intent 可能還包含綁定到其 extra 字段中的附加信息。例如,飛行模式 intent 包含布爾值 extra 來指示是否已開啟飛行模式。
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(); //獲取廣播意圖對象
isCast = intent.getBooleanExtra("iscast", false); //默認(rèn)值為false
btnStop.setEnabled(isCast); //設(shè)置停止按鈕可用和單擊監(jiān)聽
if(isCast) Toast.makeText(this, "正在播放音樂...", 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組件里,停止音樂播放服務(wù)
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, "未授權(quán),無法實(shí)現(xiàn)預(yù)定的功能!", Toast.LENGTH_SHORT).show();
finish();
}else{
Toast.makeText(this, "請發(fā)一條短信驗證...", 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程序和播放音樂的服務(wù)程序
*/
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context, MyAudioService.class);
//在廣播組件里,通過上下文對象啟動音樂播放服務(wù)組件
context.startService(serviceIntent);
//新建調(diào)用Activity組件的意圖
Intent activityIntent = new Intent(context, MainActivity.class);
activityIntent.putExtra("iscast", true); //攜帶數(shù)據(jù)
//新建棧用來存放被啟動的Activity(當(dāng)已經(jīng)存在時,只做移動處理)
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);//創(chuàng)建音樂服務(wù)。播放R.raw中的音樂liyue
mediaPlayer.start();//開始服務(wù)
}
@Override
public void onDestroy() {
mediaPlayer.stop();
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用PHP開發(fā)Android應(yīng)用程序技術(shù)介紹
這篇文章主要介紹了使用PHP開發(fā)Android應(yīng)用程序技術(shù)介紹,本文講解了安裝PHP for Android、設(shè)置PHP for Android開發(fā)環(huán)境、使用PHP構(gòu)建Android應(yīng)用程序,需要的朋友可以參考下2015-03-03
Android中WebView圖片實(shí)現(xiàn)自適應(yīng)的方法
這篇文章主要介紹了Android中WebView圖片實(shí)現(xiàn)自適應(yīng)的方法,涉及Android操作圖片顯示的相關(guān)技巧,需要的朋友可以參考下2015-05-05
Android 使用 ViewPager循環(huán)廣告位的實(shí)現(xiàn)
本文給大家分享android使用 ViewPager循環(huán)廣告位的實(shí)現(xiàn),感興趣的朋友一起學(xué)習(xí)吧2015-11-11
Android編程開發(fā)之NotiFication用法詳解
這篇文章主要介紹了Android編程開發(fā)之NotiFication用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了NotiFication的功能、使用技巧與注意事項,需要的朋友可以參考下2015-12-12
Android getJSONObject與optJSONObject的區(qū)別結(jié)合源碼分析
這篇文章主要介紹了Android getJSONObject與optJSONObject的區(qū)別,結(jié)合源碼分析的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android跳轉(zhuǎn)到系統(tǒng)聯(lián)系人及撥號或短信界面
現(xiàn)在開發(fā)中的功能需要直接跳轉(zhuǎn)到撥號、聯(lián)系人、短信界面等等,查找了很多資料,自己整理了一下特此分享到腳本之家平臺供大家參考2016-12-12
Android開發(fā)Jetpack組件Lifecycle使用篇
這一篇文章來介紹Android?Jetpack架構(gòu)組件的Lifecycle;?Lifecycle用于幫助開發(fā)者管理Activity和Fragment?的生命周期,?由于Lifecycle是LiveData和ViewModel的基礎(chǔ);所以需要先學(xué)習(xí)它2022-08-08
Android自動編輯文本框(AutoCompleteTextView)使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android自動編輯文本框AutoCompleteTextView的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android中PopupWindow響應(yīng)返回鍵并關(guān)閉的2種方法
這篇文章主要介紹了Android中PopupWindow響應(yīng)返回鍵并關(guān)閉的2種方法,本文講解了最簡單的方法、最通用的方法,需要的朋友可以參考下2015-04-04

