Android 我正在开发一个应用程序,其中列出了外部存储中的所有目录,我不断收到错误消息

Android 我正在开发一个应用程序,其中列出了外部存储中的所有目录,我不断收到错误消息,android,android-studio,kotlin,Android,Android Studio,Kotlin,E/AndroidRuntime:致命异常:主 进程:com.example.myapplication,PID:5083 java.lang.RuntimeException:无法实例化活动组件信息{com.example.myapplication/com.example.myapplication.MainActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.pm.ApplicationInfo a

E/AndroidRuntime:致命异常:主 进程:com.example.myapplication,PID:5083 java.lang.RuntimeException:无法实例化活动组件信息{com.example.myapplication/com.example.myapplication.MainActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()” 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365)上 位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)中 在android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)中 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 位于android.os.Handler.dispatchMessage(Handler.java:106) 位于android.os.Looper.loop(Looper.java:223) 位于android.app.ActivityThread.main(ActivityThread.java:7656) 位于java.lang.reflect.Method.invoke(本机方法) 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 原因:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()” 位于android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:173) 在android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174) 位于android.content.Context.ActainStyledAttributes(Context.java:744) 位于androidx.appcompat.app.appcompatedelegateimpl.createSubDecor(appcompatedelegateimpl.java:839) 在androidx.appcompat.app.appcompatedelegateimpl.ensureubdecor(appcompatedelegateimpl.java:806) 位于androidx.appcompat.app.appcompatedelegateimpl.findViewById(appcompatedelegateimpl.java:630) 在androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:223)上 在com.example.myapplication.MainActivity上。(MainActivity.kt:27) 位于java.lang.Class.newInstance(本机方法) 位于android.app.AppComponentFactory.InstanceActivity(AppComponentFactory.java:95) 位于androidx.core.app.CoreComponentFactory.InstanceActivity(CoreComponentFactory.java:45) 位于android.app.Instrumentation.newActivity(Instrumentation.java:1253) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353)上 位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)中 在android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)中 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 位于android.os.Handler.dispatchMessage(Handler.java:106) 位于android.os.Looper.loop(Looper.java:223) 位于android.app.ActivityThread.main(ActivityThread.java:7656) 位于java.lang.reflect.Method.invoke(本机方法) 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

主要活动。kt

package com.example.myapplication

import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.util.Log
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.ListView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.io.File
import java.util.*
import kotlin.collections.ArrayList


@Suppress("RECEIVER_NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
class MainActivity : AppCompatActivity() {

    companion object {
        private const val PERMISSION_REQUEST_CODE = 100
    }
    private var read: Button = findViewById(R.id.read)
    private var listview: ListView  = findViewById(R.id.list)
    private var myList: ArrayList<String>? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        myList = ArrayList()

        read.setOnClickListener {

            val state = Environment.getExternalStorageState()
            if (Environment.MEDIA_MOUNTED == state) {
                if (Build.VERSION.SDK_INT >= 23) {
                    if (checkPermission()) {
                        val dir = File(Environment.getDataDirectory().absolutePath + "/")
                        if (dir.exists()) {
                            Log.d("path", dir.toString())
                            val list = dir.listFiles()
                            for (i in list.indices) {
                                myList!!.add(list[i].name)
                            }
                            val arrayAdapter: ArrayAdapter<*> = ArrayAdapter<Any?>(this@MainActivity, android.R.layout.simple_list_item_1, myList!! as List<Any?>)
                            this.listview.adapter = arrayAdapter
                        }
                    } else {
                        requestPermission() // Code for permission
                    }
                } else {
                    val dir = File(Environment.getDataDirectory().absolutePath + "/")
                    if (dir.exists()) {
                        Log.d("path", dir.toString())
                        val list = dir.listFiles()
                        list.indices.forEach { i ->
                            myList?.add(list[i].name)
                        }
                        val arrayAdapter: ArrayAdapter<*> = ArrayAdapter<Any?>(this@MainActivity, android.R.layout.simple_list_item_1, myList!! as List<Any?>)
                        listview.adapter = arrayAdapter
                    }
                }
            }
        }
    }

                        private fun checkPermission(): Boolean {
                            val result = ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.READ_EXTERNAL_STORAGE)
                            return result == PackageManager.PERMISSION_GRANTED
                        }

                        private fun requestPermission() {
                            if (ActivityCompat.shouldShowRequestPermissionRationale(this@MainActivity, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                                Toast.makeText(this@MainActivity, "Write External Storage permission allows us to read  files. Please allow this permission in App Settings.", Toast.LENGTH_LONG).show()
                            } else {
                                ActivityCompat.requestPermissions(this@MainActivity, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE)
                            }
                        }

                        override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
                            when (requestCode) {
                                PERMISSION_REQUEST_CODE -> if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                                    Log.e("value", "Permission Granted, Now you can use local drive .")
                                } else {
                                    Log.e("value", "Permission Denied, You cannot use local drive .")
                                }
                            }
                        }



    }
package com.example.myapplication
导入android.Manifest
导入android.content.pm.PackageManager
导入android.os.Build
导入android.os.Bundle
导入android.os.Environment
导入android.util.Log
导入android.widget.ArrayAdapter
导入android.widget.Button
导入android.widget.ListView
导入android.widget.Toast
导入androidx.appcompat.app.appcompat活动
导入androidx.core.app.ActivityCompat
导入androidx.core.content.ContextCompat
导入java.io.xml文件
导入java.util*
导入kotlin.collections.ArrayList
@抑制(“基于JAVA注释的接收器可空性不匹配”)
类MainActivity:AppCompatActivity(){
伴星{
私有const val权限\请求\代码=100
}
私有变量读取:按钮=findViewById(R.id.read)
私有变量listview:listview=findViewById(R.id.list)
私有变量myList:ArrayList?=null
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
myList=ArrayList()
read.setOnClickListener{
val state=Environment.getExternalStorageState()
if(Environment.MEDIA_MOUNTED==状态){
如果(Build.VERSION.SDK_INT>=23){
if(checkPermission()){
val dir=File(Environment.getDataDirectory().absolutePath+“/”)
if(dir.exists()){
Log.d(“路径”,dir.toString())
val list=dir.listFiles()
对于(列表索引中的i){
myList!!.add(列表[i].name)
}
val arrayAdapter:arrayAdapter=arrayAdapter(this@MainActivity,android.R.layout.simple\u list\u item\u 1,myList!!作为列表)
this.listview.adapter=arrayAdapter
}
}否则{
requestPermission()//权限代码
}
}否则{
val dir=File(Environment.getDataDirectory().absolutePath+“/”)
if(dir.exists()){
Log.d(“路径”,dir.toString())
val list=dir.listFiles()
list.index.forEach{i->
myList?.add(列表[i].name)
}
val arrayAdapter:arrayAdapter=arrayAdapter(this@MainActivity,android.R.layout.simple\u列表\u项
private lateinit var read: Button
private lateinit var listview: ListView
private var myList: ArrayList<String>? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    myList = ArrayList()

    read = findViewById(R.id.read)
    listview = findViewById(R.id.list)

    read.setOnClickListener {
    ...
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.myapplication, PID: 5083 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference