Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 应用程序在点击按钮呼叫服务时崩溃_Android_Kotlin - Fatal编程技术网

Android 应用程序在点击按钮呼叫服务时崩溃

Android 应用程序在点击按钮呼叫服务时崩溃,android,kotlin,Android,Kotlin,我正在制作一个批量重命名器,当我在选择文件后单击“重命名”按钮时,它应该在显示通知时调用后台服务对其进行重命名,但应用程序在单击后崩溃。 安卓5.0上的即时通讯测试 我试着在开头放一个祝酒词,但在那之前它也崩溃了 我想它在执行按钮点击事件之前崩溃了 来自崩溃的堆栈跟踪 服务代码 类重命名服务:服务(){ 覆盖有趣的onBind(意图:意图):IBinder{ 返回空 } override-fun-onstart命令(intent:intent,flags:Int,startId:Int):I

我正在制作一个批量重命名器,当我在选择文件后单击“重命名”按钮时,它应该在显示通知时调用后台服务对其进行重命名,但应用程序在单击后崩溃。 安卓5.0上的即时通讯测试 我试着在开头放一个祝酒词,但在那之前它也崩溃了 我想它在执行按钮点击事件之前崩溃了

来自崩溃的堆栈跟踪

服务代码
类重命名服务:服务(){
覆盖有趣的onBind(意图:意图):IBinder{
返回空
}
override-fun-onstart命令(intent:intent,flags:Int,startId:Int):Int{
val bundle:bundle?=intent.extras
val pathss=bundle!!.getStringArray(“路径”)
val names=bundle!!.getStringArray(“新名称”)
val resultt:MutableList=mutableListOf()
val notifID=595
val maxProgress=pathss.size
var currentProgress=0
val inten=Intent(这是HobbiesActivity::class.java)
inten.flags=Intent.FLAG\u活动\u新建任务或Intent.FLAG\u活动\u清除任务
val pendingent:pendingent=pendingent.getActivity(this,0,inten,0)
val Builder=NotificationCompat.Builder(此“重命名器”)
.setSmallIcon(R.drawable.ic_launcher_前台)
.setContentTitle(“重命名”+pathss.size.toString()+“文件”)
.setContentText(“重命名…”)
.setStyle(NotificationCompat.BigTextStyle()
.bigText(“重命名…”)
.setPriority(通知兼容优先级高)
.setVisibility(1)
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.O){
val name=“ChannelMain”
val descText=“重命名进度”
val imp=通知管理器。重要性\u高
val通道=通知通道(“重命名器”,名称,imp)。应用{
description=descText
启用振动(真实)
}
val notificationManager:notificationManager=getSystemService(Context.NOTIFICATION\u服务)作为notificationManager
notificationManager.createNotificationChannel(频道)
}
Toast.makeText(这是“重命名”,Toast.LENGTH\u SHORT.show())
startForeground(Notified,builder.build())
与(来自(此)的NotificationManagerCompat{
builderr.setProgress(maxProgress、currentProgress、false)
通知(Notifyd,builderr.build())
用于(0..pathss.size中的i)
{
如果(重命名获取(路径[i],名称[i])!=0)
{
结果添加(“失败”)
}
其他的
{
结果添加(“成功”)
}
当前进度=i
builderr.setContentText(“重命名”+Paths.size.toString()的“+i.toString()+”)
builderr.setProgress(maxProgress、currentProgress、false)
通知(Notifyd,builderr.build())
}
builderr.setContentText(“重命名完成”)
.setProgress(0,0,false)
.setContentIntent(挂起内容)
.setAutoCancel(真)
通知(Notifyd,builderr.build())
}
返回服务。启动\u重新交付\u意图
}
重写onDestroy(){
super.ondestory()
Toast.makeText(这是“重命名完成”,Toast.LENGTH\u SHORT.show())
停止前景(真)
}
覆盖onTaskRemoved(rootIntent:Intent?){
super.onTaskRemoved(rootIntent)
stopSelf()
}
}
fun-renameTarget(filePath:String,newName:String):Int{
val src=文件(文件路径)
var ext=“”
val目的地:文件
if(src.isFile)
{
ext=filePath.substring(filePath.lastIndexOf(“.”),filePath.length)
}
if(newName.isEmpty())
{
返回-1
}
val temp=filePath.substring(0,filePath.lastIndexOf(“/”))
dest=文件(“$temp/$newName$ext”)
返回if(src.renameTo(dest)){
0
}否则{
1.
}
}

如果没有Mike在评论中请求的堆栈跟踪,我唯一能想到的是你忘了将你的按钮与xml按钮的ID链接起来

findViewById(R.id.button);

类似这样的问题很可能是由以下行引起的:
for(i in 0..cc)
。原因是运算符
创建了一个封闭范围,其中包含
cc
,因此如果
cc
等于列表/数组的大小,则您将获得
索引自动边界异常。要解决这个问题,您只需将行更改为
(i in 0直到cc)
,因为该函数创建的范围不包括end元素

请你的问题提供完整的。可能的副本我会去一些遗漏的许可。你的应用程序可能抛出了SecurityException?重复的不知道为什么向下投票,我不能发表评论,所以我发布了我认为可以帮助回答这个问题的内容,当然,一旦我看到错误输出,我将编辑这个答案问题出在arrayList java.lang.IndexOutOfBoundsException的索引上:无效的索引2,在代码的某个点上,您正在访问数组外部的大小为2
renamebtn.setOnClickListener {
        val paramtxt = paratxt.text.toString().trim()
        var reptxt = paramtxt
        for(i in 0..cc)
        {
            reptxt = reptxt.replace("%title",seltitle[i],true)
            reptxt = reptxt.replace("%album",selalbum[i],true)
            reptxt = reptxt.replace("%artist",selartist[i],true)
            resultt.add(reptxt)
        }
        val inte = Intent(this,RenameService::class.java)
        inte.putExtra("path",selpath.toTypedArray())
        inte.putExtra("newname",resultt.toTypedArray())
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        {
            startForegroundService(inte)
        }
        else{
            startService(inte)
        }
    }
class RenameService : Service() {

override fun onBind(intent: Intent): IBinder? {
    return null
}

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
    val bundle: Bundle?=intent.extras
    val pathss = bundle!!.getStringArray("path")
    val namess = bundle!!.getStringArray("newname")
    val resultt:MutableList<String> = mutableListOf()
    val notifID = 595
    val maxProgress = pathss.size
    var currentProgress = 0

    val inten = Intent(this, HobbiesActivity::class.java)
    inten.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

    val pendingIntent : PendingIntent = PendingIntent.getActivity(this,0,inten,0)

    val builderr = NotificationCompat.Builder(this, "Renamer")
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setContentTitle("Renaming " + pathss.size.toString() + " files")
            .setContentText("Renaming....")
            .setStyle(NotificationCompat.BigTextStyle()
                    .bigText("Renaming..."))
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setVisibility(1)

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name = "ChannelMain"
        val descText = "Renaming Progress"
        val imp = NotificationManager.IMPORTANCE_HIGH
        val channel = NotificationChannel("Renamer", name, imp).apply {
            description = descText
            enableVibration(true)
        }
        val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }
    Toast.makeText(this,"Renaming",Toast.LENGTH_SHORT).show()
    startForeground(notifID,builderr.build())

    with(NotificationManagerCompat.from(this)){
        builderr.setProgress(maxProgress, currentProgress, false)
        notify(notifID, builderr.build())

        for(i in 0..pathss.size)
        {
            if(renameTarget(pathss[i],namess[i])!=0)
            {
                resultt.add("Failed")
            }
            else
            {
                resultt.add("Success")
            }
            currentProgress = i
            builderr.setContentText("Renaming " + i.toString() + " of " + pathss.size.toString())
            builderr.setProgress(maxProgress,currentProgress,false)
            notify(notifID,builderr.build())
        }

        builderr.setContentText("Rename Complete")
                .setProgress(0,0,false)
                .setContentIntent(pendingIntent)
                .setAutoCancel(true)
        notify(notifID,builderr.build())
    }
    return Service.START_REDELIVER_INTENT
}

override fun onDestroy() {
    super.onDestroy()
    Toast.makeText(this,"Renaming completed",Toast.LENGTH_SHORT).show()
    stopForeground(true)
}

override fun onTaskRemoved(rootIntent: Intent?) {
    super.onTaskRemoved(rootIntent)
    stopSelf()
}
}

fun renameTarget(filePath:String, newName:String):Int{
val src= File(filePath)
var ext=""
val dest: File
if(src.isFile)
{
    ext=filePath.substring(filePath.lastIndexOf("."),filePath.length)
}
if(newName.isEmpty())
{
    return -1
}
val temp=filePath.substring(0,filePath.lastIndexOf("/"))
dest= File("$temp/$newName$ext")
return if(src.renameTo(dest)) {
    0
} else {
    1
}
}
findViewById(R.id.button);