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