标签: kotlin

升级到Android 8.1后,startForeground失败

将手机升级到8.1开发人员预览后,我的后台服务不再正常启动.

在我长期运行的服务中,我实现了一个startForeground方法来启动正在进行的通知,该通知在create上调用.

    @TargetApi(Build.VERSION_CODES.O)
private fun startForeground() {
    // Safe call, handled by compat lib.
    val notificationBuilder = NotificationCompat.Builder(this, DEFAULT_CHANNEL_ID)

    val notification = notificationBuilder.setOngoing(true)
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .build()
    startForeground(101, notification)
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

11-28 11:47:53.349 24704-24704/$PACKAGE_NAMEE/AndroidRuntime: FATAL EXCEPTION: main
    Process: $PACKAGE_NAME, PID: 24704
    android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=My channel pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Run Code Online (Sandbox Code Playgroud)

服务通知的通道无效,显然我的旧通道DEFAULT_CHANNEL_ID不再适用于我假设的API 27.什么是合适的渠道?我试图浏览一下文档

service android background-service android-notifications kotlin

159
推荐指数
6
解决办法
8万
查看次数

Android Studio中过时的Kotlin运行时警告

下载并安装了最新的Kotlin插件后,我从Android Studio发出了Outdated Kotlin Runtime警告,告诉我:

您在'kotlin-stdlib-1.1.2'库中的Kotlin运行时版本是1.1.2,而插件版本是1.1.2-release-Studio2.3-3.应更新运行时库以避免兼容性问题.

我尝试单击" 更新运行时"按钮,但收到另一条消息:

目前不支持Gradle项目的自动库版本更新.请手动更新build.gradle.

如何解决这个问题?

android kotlin android-studio kotlin-android-extensions

154
推荐指数
4
解决办法
7万
查看次数

在Kotlin登录的惯用方法

Kotlin没有与Java中使用的静态字段相同的概念.在Java中,普遍接受的日志记录方式是:

public class Foo {
    private static final Logger LOG = LoggerFactory.getLogger(Foo.class);
}
Run Code Online (Sandbox Code Playgroud)

问题是在Kotlin中执行日志记录的惯用方法是什么?

kotlin kotlin-logging

153
推荐指数
5
解决办法
3万
查看次数

错误:任务':app:clean'的执行失败.无法删除文件

我正在尝试重建我的Android Studio Gradle项目(主要包含Kotlin代码),但它UnableToDeleteFileException在清理/重建过程中开始抛出:

Execution failed for task ':app:clean'.
> Unable to delete file: C:\Users\User\KotlinGameEngine\app\build\intermediates\exploded-aar\com.android.support\appcompat-v7\23.0.1\jars\classes.jar
Run Code Online (Sandbox Code Playgroud)

在我尝试更改项目的包结构后,这种情况开始发生.不幸的是,我是通过重命名和移动源文件夹而不是通过Android Studio重构来实现的,这是一个坏主意.

我一整天都在寻找解决这个问题的方法,这些都是我试过无用的东西:

  • 进行Gradle同步;
  • 重新安装Java JRE和Java SDK;
  • 重新安装最新版本的Android Studio(1.4);
  • 回滚到之前的AS版本(1.3);
  • 使AS缓存无效并重新启动;
  • 删除项目目录中的gradle.gradle目录;
  • 删除.gradle我的用户目录中的目录;
  • gradlew clean从AS终端运行;
  • 手动将源代码复制到一个新项目(奇怪的是它在项目中以某种方式存在......)

我尝试了一些有点成功的事情,但只让我再次执行一次干净并重新构建错误之前:

  • 关闭AS,手动删除构建文件并再次打开它;
  • java.exe在AS运行时杀死进程(这在技术上可以每次都完成,但是它很繁琐并且减慢了构建过程)

所以似乎编译Java进程可能由于某种原因锁定构建文件,但它也可能与Kotlin有关.我有一个(更成熟的)Java Android项目,我正在努力,虽然我在清理时无法重现此错误.这似乎只发生在我的Kotlin项目上.

有任何想法吗?

提前致谢.

更新:

我发现问题是由Kotlin Android插件引起的.当我apply plugin: 'kotlin-android'从模块的build.gradle文件中删除时,问题消失,并在重新插入时返回.随意提供任何洞察力.

更新2:

最后一次更新不是原因.我发现如果一个项目包含一个Kotlin文件,那么重建和清理就会失败.它继续失败,即使所有Kotlin文件都被删除,直到后台Java进程被杀死,这意味着它对构建文件有某种锁定.我在这里提交了一个错误,其中包含更多细节和重现错误的步骤:KT-9440

android kotlin android-studio android-gradle-plugin kotlin-android-extensions

152
推荐指数
11
解决办法
16万
查看次数

如何将主键作为Room Persistence lib的自动增量

我正在创建一个Entity(Room Persistence lib)类Food,我想把它foodId作为自动增量.

@Entity
class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double)
{
    @PrimaryKey
    var foodId: Int = 0
    var calories: Double = 0.toDouble()
}
Run Code Online (Sandbox Code Playgroud)

如何设置foodId自动增量字段?

android kotlin android-room

151
推荐指数
8
解决办法
7万
查看次数

不推荐使用RegisterResGeneratingTask,使用registerGeneratedFolders(FileCollection)

使用新的Android工作室与新的3.0.0 Gradle插件.
当发生一些警告时:

registerResGeneratingTask is deprecated, use
registerGeneratedFolders(FileCollection)
Run Code Online (Sandbox Code Playgroud)

android gradle kotlin android-studio android-studio-3.0

151
推荐指数
5
解决办法
5万
查看次数

如何在Kotlin Android中为数据类创建空构造函数

我在数据类中有10+参数,我想用空构造函数初始化数据类,并使用setter仅为少数参数设置值,并将对象传递给服务器.

data class Activity(
        var updated_on: String,
        var tags: List<String>,
        var description: String,
        var user_id: List<Int>,
        var status_id: Int,
        var title: String,
        var created_at: String,
        var data: HashMap<*, *>,
        var id: Int,
        var counts: LinkedTreeMap<*, *>,
)
Run Code Online (Sandbox Code Playgroud)

用法:

这样的事情很容易

                val activity =  Activity();
                activity.title = "New Computer"
                sendToServer(activity)
Run Code Online (Sandbox Code Playgroud)

但它需要在创建构造函数时传递所有参数.我怎样才能像上面这样简化?

                val activity =  Activity(null,null,null,null,null,"New Computer",null,null,null,null);
                sendToServer(activity)
Run Code Online (Sandbox Code Playgroud)

android kotlin

148
推荐指数
8
解决办法
6万
查看次数

如何在Kotlin中将List转换为Map?

例如,我有一个字符串列表,如:

val list = listOf("a", "b", "c", "d")
Run Code Online (Sandbox Code Playgroud)

我想将它转换为地图,其中字符串是键.

我知道我应该使用.toMap()函数,但我不知道如何,我还没有看到它的任何例子.

dictionary kotlin

146
推荐指数
5
解决办法
5万
查看次数

如何在Kotlin中将String转换为Long?

Kotlin挑战赛已经开始.

所有任务都是编写一个控制台程序,从控制台读取参数并将输出写入控制台以进行自动检查.

Kotlin的主要方法看起来像

fun main(args: Array<String>): Unit {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

任务中的大多数输入参数都应解释为数字.所以,由于缺乏像Long.valueOf(String s)我刚刚卡住的方法.我无法将String转换为Long,我感到惭愧.

kotlin

142
推荐指数
7
解决办法
6万
查看次数

为什么我们使用"伴侣对象"作为Kotlin中Java静态字段的替代?

"伴侣对象"的意图是什么?到目前为止,我一直在使用它只是为了static在需要时替换Java .

我很困惑:

  • 为什么称它为"伴侣"?
  • 这是否意味着要创建多个静态属性,我必须在companion object块内组合它?
  • 为了立即创建一个作用于类的单例实例,我经常写

:

companion object {
    val singleton by lazy { ... }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一种单一的方式.有什么更好的方法?

kotlin kotlin-companion

141
推荐指数
4
解决办法
3万
查看次数