您好,登錄后才能下訂單哦!
這篇“Android音樂播放器如何實現”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android音樂播放器如何實現”文章吧。
MediaPlayer 是Android 控制音頻和視頻文件播放類
1.創建MediaPlayer 對象 的Create方法
2.無can構造方法 -> setDataSorce -> prepare()加載創造文件
注意訪問SDK需要授予權限
當Mediaplay.stop() 資源后需要重新加載資源,使用Mediaplay.setDataSource() 方法進行加載 ,最后還需要釋放資源,防止內存泄漏
缺點:
1.延遲低長,占有資源多
2. 不支持同時播放多個音頻
package com.example.myapplication; import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.ImageButton; import android.widget.Toast; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import java.io.File; import java.io.IOException; /** * MediaPlay 實現簡易的播放器 */ public class MainActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; //定義MediaPlayer對象 private boolean isPause = false; //定義是否暫停 private File file; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ImageButton btn_play = (ImageButton) findViewById(R.id.btn_play); //獲取“播放/暫停”按鈕 final ImageButton btn_stop = (ImageButton) findViewById(R.id.btn_stop); //獲取“停止”按鈕 ; file = new File("/res/raw/bird.ogg"); if (file.exists()) { mediaPlayer = MediaPlayer.create(this, Uri.parse(file.getAbsolutePath())); } else { Toast.makeText(MainActivity.this, "要播放的音頻文件不存在!", Toast.LENGTH_SHORT).show(); return; } // 為MediaPlayer 添加監聽事件 完成事件監聽器,當media.play.stop 后在重新play mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { play(); } }); btn_play.setOnClickListener(new View.OnClickListener(){ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onClick(View view) { if(mediaPlayer.isPlaying() && !isPause){ mediaPlayer.pause(); isPause = true; // 暫停播放 // 更好播放圖標 ((ImageButton) view).setImageDrawable(getResources().getDrawable(R.drawable.play, null)); }else{ mediaPlayer.start(); //繼續播放 // 更換為暫停圖標 ((ImageButton) view).setImageDrawable(getResources().getDrawable(R.drawable.pause, null)); isPause = false; //設置為播放狀態 } } }); btn_stop.setOnClickListener(new View.OnClickListener() { //單擊停止按鈕,實現停止播放音頻 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onClick(View v) { mediaPlayer.stop(); //停止播放 //更換為播放圖標 btn_play.setImageDrawable(getResources().getDrawable(R.drawable.play, null)); } }); } private void play(){ // 重置MediaPlay mediaPlayer.reset(); try { mediaPlayer.setDataSource(file.getAbsolutePath()); mediaPlayer.prepare(); // 預加載 } catch (IOException e) { e.printStackTrace(); } } @Override protected void onDestroy() { if(mediaPlayer.isPlaying()){ mediaPlayer.stop(); } mediaPlayer.release(); super.onDestroy(); } }
優點:
1. 延遲低
2.占有資源少
3. 支持多個音頻播放
缺點: 不能播放大文件音頻
應用場景: 小型游戲中多個飛機被擊破聲音
創建SoundPool 對象,load , play
package com.example.myapplication; import android.media.AudioAttributes; import android.media.SoundPool; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import androidx.appcompat.app.AppCompatActivity; import java.util.HashMap; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = findViewById(R.id.listView); // 創建SoundPool 對象設置音頻相關特性 //1.音頻對象 AudioAttributes attr = new AudioAttributes.Builder() //設置音效相關屬性 .setUsage(AudioAttributes.USAGE_GAME) // 設置音效使用場景 .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) // 設置音效的類型 .build(); final SoundPool soundpool = new SoundPool.Builder() // 創建SoundPool對象 .setAudioAttributes(attr) // 設置音效池的屬性 .setMaxStreams(10) // 設置最多可容納10個音頻流, .build(); // 要播放音頻保存到HashMap中 final HashMap<Integer, Integer> soundmap = new HashMap<Integer, Integer>(); soundmap.put(0, soundpool.load(this, R.raw.cuckoo, 1)); soundmap.put(1, soundpool.load(this, R.raw.chimes, 1)); soundmap.put(2, soundpool.load(this, R.raw.notify, 1)); soundmap.put(3, soundpool.load(this, R.raw.ringout, 1)); soundmap.put(4, soundpool.load(this, R.raw.bird, 1)); soundmap.put(5, soundpool.load(this, R.raw.water, 1)); soundmap.put(6, soundpool.load(this, R.raw.cock, 1)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { soundpool.play(soundmap.get(i),1,1,0,0,1); } }); } }
在XML中添加Videoview 組件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <VideoView android:id="@+id/video" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
讀取SDK上數據 設置Mainifest.xml 設置訪問權限,同時在Android 機器上設置權限打開
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> ----------------------------------------------------------- <?xml version="1.0" encoding="utf-8"?> <manifest package="com.mingrisoft" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:screenOrientation="landscape"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
package com.example.myapplication; import android.media.MediaPlayer; import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import android.os.Environment; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; import java.io.File; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); VideoView videoView = findViewById(R.id.video); File file = new File(Environment.getExternalStorageDirectory()+"/video.mp4"); if(file.exists()){ videoView.setVideoPath(file.getAbsolutePath()); }else{ return ; } // 控制視頻播放 MediaController mc = new MediaController(MainActivity.this); videoView.setMediaController(mc); // videoiew 獲取焦點 videoView.requestFocus(); videoView.start(); // 完成監聽器 videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { Toast.makeText(MainActivity.this,"視頻播放完成",Toast.LENGTH_SHORT).show(); } }); } }
<!-- 授予程序可以向SD卡中保存文件的權限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 授予程序使用攝像頭的權限 --> <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera.autofocus"/> <uses-feature android:name="android.hardware.camera"/>
package com.example.myapplication; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PixelFormat; import android.hardware.Camera; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.WindowManager; import android.widget.ImageButton; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity { private Camera camera; private boolean isPreview = false; // 設置是否是預覽狀態 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //設置全屏顯示 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); if (!android.os.Environment.getExternalStorageState().equals( //判斷手機是否安裝SD卡 android.os.Environment.MEDIA_MOUNTED)) { Toast.makeText(this, "請安裝SD卡!", Toast.LENGTH_SHORT).show(); // 提示安裝SD卡 } // 設置預覽 final SurfaceView surfaceView = findViewById(R.id.surfaceView); final SurfaceHolder surfaceHolder = surfaceView.getHolder(); // 設置自己維護緩存 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); ImageButton preview = (ImageButton) findViewById(R.id.preview); //獲取“預覽”按鈕 ImageButton takePicture = (ImageButton) findViewById(R.id.takephoto); //獲取“拍照”按鈕 preview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (!isPreview) { camera = Camera.open(); isPreview = true; } try { camera.setPreviewDisplay(surfaceHolder); // 設置用于顯示預覽的SurfaceView Camera.Parameters parameters = camera.getParameters(); //獲取相機參數 parameters.setPictureFormat(PixelFormat.JPEG); //指定圖片為JPEG圖片 parameters.set("jpeg-quality", 80); //設置圖片的質量 camera.setParameters(parameters); //重新設置相機參數 camera.startPreview(); //開始預覽 camera.autoFocus(null); //設置自動對焦 } catch (IOException e) { //輸出異常信息 e.printStackTrace(); } } }); // 保存拍照 //實現相機拍照功能 takePicture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (camera != null) { //相機不為空 camera.takePicture(null, null, jpeg); //進行拍照 } } }); } final Camera.PictureCallback jpeg = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 根據拍照所得的數據創建位圖 final Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length); camera.stopPreview(); //停止預覽 isPreview = false; //設置為非預覽狀態 //獲取sd卡根目錄 File appDir = new File(Environment.getExternalStorageDirectory(), "/DCIM/Camera/"); if (!appDir.exists()) { //如果該目錄不存在 appDir.mkdir(); //就創建該目錄 } String fileName = System.currentTimeMillis() + ".jpg"; //將獲取當前系統時間設置為照片名稱 File file = new File(appDir, fileName); //創建文件對象 try { //保存拍到的圖片 FileOutputStream fos = new FileOutputStream(file); //創建一個文件輸出流對象 bm.compress(Bitmap.CompressFormat.JPEG, 100, fos); //將圖片內容壓縮為JPEG格式輸出到輸出流對象中 fos.flush(); //將緩沖區中的數據全部寫出到輸出流中 fos.close(); //關閉文件輸出流對象 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 將照片插入到圖庫當中 try { MediaStore.Images.Media.insertImage(MainActivity.this.getContentResolver(), file.getAbsolutePath(),fileName,null); } catch (FileNotFoundException e) { e.printStackTrace(); } // 更新通知圖庫 MainActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + ""))); restCamera(); } }; private void restCamera(){ if(!isPreview){ camera.startPreview(); isPreview = true; } } @Override protected void onPause() { //當暫停Activity時,停止預覽并釋放資源 if (camera != null) { //如果相機不為空 camera.stopPreview(); //停止預覽 camera.release(); //釋放資源 } super.onPause(); } }
以上就是關于“Android音樂播放器如何實現”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。