Androidネイティブ技術を活用し、シンプルなインターフェースのアプリを実現

実現効果:Androidネイティブ技術で音楽アプリを実現

ここに画像の説明を挿入

音楽アプリ開発環境:
Win10+Android Studio2020+JDK1.8 + Gradle6.5.1 +Android SDK32 + buildToolVersion32 には
ここに画像の説明を挿入
ここに画像の説明を挿入
次の依存関係が必要です。

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

    implementation('com.karumi:dexter:6.2.2')
    implementation('com.gauravk.audiovisualizer:audiovisualizer:0.9.2')
}

AndroidアプリにはAndroidManifestというアプリの基本情報が格納されている重要なファイルがあり、この音楽アプリの基本情報と許可申請は以下の通りです。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxxx.player">
    <!-- 文件系统权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEM" />
    <!-- 存储权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--记录音频权限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

    <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">
        <activity android:name=".PlayerActivity"></activity>
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:requestLegacyExternalStorage="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

MainActivityファイル

package com.xxxx.player;

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.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
import com.karumi.dexter.listener.single.PermissionListener;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    
    


    private ListView listView;
    private String[] items;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        checkPermission();

        listView = findViewById(R.id.listViewSongs);


        runtimePermission();
    }

    private void checkPermission() {
    
    
        // 需要申请的权限列表
        String[] permissions = new String[]{
    
    Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
        // 需要授权权限列表
        List<String> tempPermissions = new ArrayList<>();
        for (String permission : permissions) {
    
    
            // 判断授权是否已经获取
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
    
    
                tempPermissions.add(permission);
            }
        }
        // 如果需要授权列表不为空,那么就授权
        if (tempPermissions.size() != 0) {
    
    
            //1是用来在回调函数中判断是哪次请求的【请求码】
            ActivityCompat.requestPermissions(this, tempPermissions.toArray(new String[tempPermissions.size()]), 1);
        }
    }

    // 回调函数,根据是否同意授权做出反应
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    public void runtimePermission() {
    
    

        Dexter.withContext(this).withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO)
                .withListener(new MultiplePermissionsListener() {
    
    
                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) {
    
    
                        displaySongs();
                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
    
    
                        permissionToken.continuePermissionRequest();
                    }
                }).check();
    }

    public ArrayList<File> findSongs(File file) {
    
    
        ArrayList<File> arrayList = new ArrayList<>();

        File[] files = file.listFiles();
        if (files != null) {
    
    
            for (File singleFile : files) {
    
    
                if (singleFile.isDirectory() && !singleFile.isHidden()) {
    
    
                    arrayList.addAll(findSongs(singleFile));
                } else {
    
    
                    if (singleFile.getName().endsWith(".mp3") || singleFile.getName().endsWith(".wav")) {
    
    
                        arrayList.add(singleFile);
                    }
                }
            }
        }
        return arrayList;
    }

    void displaySongs() {
    
    
        final ArrayList<File> mySongs = findSongs(Environment.getExternalStorageDirectory());

        items = new String[mySongs.size()];
        for (int i = 0; i < mySongs.size(); i++) {
    
    
            items[i] = mySongs.get(i).getName().toString().replace(".mp3", "").replace(".wav", "");

        }

//        ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
//        listView.setAdapter(myAdapter);

        customAdapter customAdapter = new customAdapter();
        listView.setAdapter(customAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
    
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
    
                String songName = (String) listView.getItemAtPosition(position);
                startActivity(new Intent(getApplicationContext(), PlayerActivity.class)
                        .putExtra("songs", mySongs)
                        .putExtra("songName", songName)
                        .putExtra("position", position));
            }
        });
    }


    class customAdapter extends BaseAdapter {
    
    

        @Override
        public int getCount() {
    
    
            return items.length;
        }

        @Override
        public Object getItem(int position) {
    
    
            return null;
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
    

            View view = getLayoutInflater().inflate(R.layout.list_item, null);
            TextView songName = view.findViewById(R.id.songName);
            songName.setSelected(true);
            songName.setText(items[position]);

            return view;
        }
    }

}

このアプリケーションのソースコードが必要な場合は、私に連絡してください。知識にはお金を払おう!売春はお断り!

Supongo que te gusta

Origin blog.csdn.net/qq_44723773/article/details/128756872
Recomendado
Clasificación