android - 如何在 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
}
}
}
解决方案
推荐阅读
- oracle - ORA-01858 在执行创建的过程时
- kotlin - RxJava2 如果元素当前存在于流中,则忽略它
- docker - 如何通过容器的 IP 地址访问 Docker 容器的服务?
- ios - 实例化 MPVolumeView 时,新的 OutputDeviceUID 为 nil msg
- java - 从文本文件中逐行读取并将每一行保存到数组中的不同单元格中
- r - R Knit Markdown 代码块:“找不到对象”
- alfresco - Activiti 通过组 id 获取用户
- c# - Active Directory 检索组中的组成员似乎陷入无限循环
- java - 如果我们可以使用构造函数设置所有值,为什么还要在 java 中使用 setter?
- python - 从 API 获取数据并对每年的 2 个值求和