Android音乐App开发准备( 简易音乐 一 )

关于

  年前学习网易云因为app,想着学习网易云app的界面以及功能开发。年前那会刚毕业没多久,技术能力一般,项目就只是用了mvp框架,用了很多第三方。然后最近拿来在原来基础上进行完善顺便学习一下音乐的各种播放api。

第一步,获取音乐来源

  首先就需要音乐来源,然后我百度了网易云音乐API(网上好多):
在这里插入图片描述

,当然了我选择的自己搭建的,你也可以去github按照教程一步一步来,看到这个界面就表示成功了。

第二步,开发环境

  这里假设上一步你已经实现啦,下面是一些项目基本配置:

  • 开发工具 android studio 3.5.3
  • 开发语音 JAVA
  • 主要使用技术 butterknife+retrofit2+rxjava2+glide(基本的就是这样,后面还会有其他的会再介绍)

第三步,引用三方

  首先是项目根目录功能引用:

dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
        classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

  项目目录build.gradle配置(因为涉及多dex的配置,我就直接贴全了):

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"
    defaultConfig {
        applicationId "com.tobey.jianyimusic"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    dexOptions { //优化dex配置
        dexInProcess true
        preDexLibraries true
        javaMaxHeapSize "2g" //Java SDK 64位

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    
    //第三方引用开始
    implementation 'androidx.coordinatorlayout:coordinatorlayout:1.0.0'
    //黄油刀
    implementation 'com.jakewharton:butterknife:10.2.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
    //权限
    implementation 'com.permissionx.guolindev:permissionx:1.4.0'
    //glide引用
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    //网络请求retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    //RxJava
    implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
    //RxAndroid
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    //Retrofit 支持Rxjava 的支持库
    implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    //rxjava框架
    implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
    implementation 'com.google.code.gson:gson:2.8.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
    // MultiDex的依赖
    implementation 'androidx.multidex:multidex:2.0.0'
    //吐司
    implementation 'com.hjq:toast:8.6'
    // CookieJar
    implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
}

第四步,添加唯一进程App.java

  代码中关于activity堆栈式管理类AppManager参考博文Android实现全局前后台监听

public class App extends Application {

    private static App instance;

    //多核优化冷启动初始化
    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
    private static final int CORE_POOL_SIZE = Math.max(2,Math.min(CPU_COUNT-1,4));
    private CountDownLatch mCountDownLatch = new CountDownLatch(1);
    // 单例模式获取唯一的Application实例
    public static Application getInstance(){
        return instance.getApplication();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
       Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
           @Override
           public boolean queueIdle() {
               //空闲时初始化,toast在主线程初始化,子线程会崩溃(不做looper等的修改)
                ToastUtils.init(instance,new ToastQQStyle(instance));
               return false;
           }
       });
        ExecutorService pool = Executors.newFixedThreadPool(CORE_POOL_SIZE);
        pool.submit(new Runnable() {
            @Override
            public void run() {
               
                mCountDownLatch.countDown();
            }
        });
        pool.submit(new Runnable() {
            @Override
            public void run() {

                //第三方初始化

            }
        });
        try {
            //如果await之前没有调用countDown那么就会一直阻塞在这里
            mCountDownLatch.await();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
 registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                
                WeakReference<Activity> weakReference = new WeakReference<>(activity);
                AppManager.getAppManager().addActivity(weakReference);
            }

            @Override
            public void onActivityStarted(@NonNull Activity activity) {

            }

            @Override
            public void onActivityResumed(@NonNull Activity activity) {

            }

            @Override
            public void onActivityPaused(@NonNull Activity activity) {

            }

            @Override
            public void onActivityStopped(@NonNull Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(@NonNull Activity activity) {
                WeakReference<Activity> weakReference = new WeakReference<>(activity);
                AppManager.getAppManager().removeActivity(weakReference);
            }
        });
    }

    private Application getApplication() {
        return this;
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }
}

  然后记得要在AndroidManifest.xml配置文件中声明Appandroid:name=".App",然后在配置文件中添加对应部分权限:

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 允许安装和卸载文件系统权限 -->
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <!-- 解锁屏幕需要的权限 -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

  到目前为止,最初的项目配置已经初步完成了,第二篇请看Android音乐App开发准备( 简易音乐 二 )(关于混淆暂时先不配置),如果觉得写的不错的话记得点个赞 嗷~~

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪の星空朝酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值