首页 > 解决方案 > 如何在 AIDL 中传递枚举?

问题描述

我尝试使用 AIDL 传递枚举并且它包装了一个 Parcelable 但它仍然无法编译并出现以下错误:

> Task :app:compileDebugAidl FAILED
ERROR: uk.ac.liverpool.altphone.service.Mode: couldn't find import for class uk.ac.liverpool.altphone.service.Mode

我的文件如下:

项目级别build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.4.20"
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.1"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        def nav_version = "2.3.3"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"


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

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

模块级别build.gradle

plugins {
    id 'com.android.application'
    id "androidx.navigation.safeargs"
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'kotlin-parcelize'
    id "com.google.protobuf" version "0.8.12"
}
preBuild {
    doFirst {
        new ProcessBuilder("java", "$rootDir/scripts/Zipper.java")
        .directory(new File("$rootDir"))
        .start()
        .waitFor()
    }
}

android {
    compileSdkVersion 29
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "uk.ac.liverpool.altphone"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    buildFeatures {
        viewBinding true
    }
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    tasks.withType(JavaCompile) {
        configure(options) {
            options.debug = true
            options.warnings = true
            options.compilerArgs << '-Xlint:all' << '-parameters' << '-g:source,lines,vars'
        }
    }
}

dependencies {
    implementation 'androidx.activity:activity-ktx:1.2.0-beta02'
    implementation 'androidx.appcompat:appcompat:1.3.0-alpha02'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.0-alpha1'
    implementation 'androidx.core:core-ktx:1.5.0-alpha05'
    implementation 'androidx.datastore:datastore:1.0.0-alpha06'
    implementation 'androidx.datastore:datastore-core:1.0.0-alpha06'
    implementation 'androidx.fragment:fragment-ktx:1.3.0-beta02'
    def nav_version = "2.3.3"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
    implementation 'androidx.recyclerview:recyclerview:1.2.0-beta01'
    def room_version = "2.3.0-alpha03"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation 'androidx.startup:startup-runtime:1.0.0'
    implementation 'com.google.android.material:material:1.3.0-alpha04'
    implementation  "com.google.protobuf:protobuf-javalite:3.10.0"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1'
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.10.0"
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option 'lite'
                }
            }
        }
    }
}

AIDL 文件app/src/main/aidl/uk/ac/liverpool/altphone/service/IAltPhoneServiceInterface.aidl

// IAltPhoneServiceInterface.aidl
package uk.ac.liverpool.altphone.service;

// Declare any non-default types here with import statements
import uk.ac.liverpool.altphone.service.Mode;

interface IAltPhoneServiceInterface {

    oneway void setMode(in Mode mode);

    oneway void updateSettings(in Mode mode, in int headphone);

    oneway void stop();
}

科特林文件app/src/main/java/uk/ac/liverpool/altphone/service/AltPhoneService.kt

package uk.ac.liverpool.altphone.service

import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import uk.ac.liverpool.altphone.R

class AltPhoneService : Service() {
    override fun onBind(intent: Intent): IBinder {
        return null!!
    }
}

@Parcelize
public enum class Mode : Parcelable {
    SINGLE, ALTERNATE;

    companion object {
        fun getModeByID(id: Int): Mode? = when (id) {
            R.id.single_mode_mi -> SINGLE
            R.id.alternate_mode_mi -> ALTERNATE
            else -> null
        }
    }
}

标签: androidandroid-studiokotlinenumsaidl

解决方案


推荐阅读