56704


Kotlinでパッケージ名からアイコン（Drawable）とアプリ名を取得する処理を行いたいのですが、NullPointerExceptionが発生してしまいます。

以下にプログラムの全文を載せます。  
Loading.ktでデータ（パッケージ名＋その他）を読み込み、IntentでMainActivityに渡しています。MainActivityにてパッケージ名からアイコンとアプリ名を生産しています。（←ここでヌルポが発生
MainActivity.kt GetAppName(),GetAppIcon()）

エラーメッセージは以下のとおりです。

[code]

    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
    
[/code]

nullオブジェクトと言われても、宣言と同時に`getgetApplicationContext().getPackageManager()`で初期化しているはずなので、エラーメッセージの内容がよくわかりません...

ご教授お願いします。

※ヤフー知恵袋にてマルチポストを行っています。<https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13210123708>

MainActivity.kt

[code]

    package caios.android.notification_log
    
    import android.app.Application
    import android.content.Context
    import android.content.Intent
    import android.content.pm.ApplicationInfo
    import android.content.pm.PackageManager
    import android.graphics.BitmapFactory
    import android.graphics.drawable.Drawable
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import android.util.Log
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.ArrayAdapter
    import android.widget.ImageView
    import android.widget.TextView
    import android.widget.Toast
    import kotlinx.android.synthetic.main.activity_main.*
    import java.io.BufferedReader
    import java.io.File
    
    class MainActivity : AppCompatActivity() {
    
        //private var NotificationName: ArrayList<String>? = arrayListOf()
        //private var NotificationText: ArrayList<String>? = arrayListOf()
        //private var NotificationIcon: ArrayList<Drawable>? = arrayListOf()
        private var BootNum = 0
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            getPackageManager()
    
            if(BootNum == 0) {
                Load()
                BootNum++
    
                val intent = getIntent()
                if (intent != null) {
                    Log.d("System","Get Intent")
    
                    val NotificationName = intent.getStringArrayListExtra("Name")
                    val NotificationText = intent.getStringArrayListExtra("Text")
                    var FileCount = intent.getIntExtra("FileCount", 0)
    
                    if(FileCount >= 0) {
    
                        val NotificationLogList = MutableList(FileCount) { i ->
                            NotificationData(
                                NotificationName[i],
                                NotificationText[i]
                            )
                        }
    
                        val adapter = NotificationAdapter(this, NotificationLogList)
                        NotificationListView.adapter = adapter
    
                        Log.d("System","Set Adapter")
                    }
                }
            }
        }
    
        fun Load() {
            Log.d("System","Call Load")
    
            val intent = Intent(this, Loading::class.java)
            startActivity(intent)
        }
    
        fun GetAppName(packageName: String): String {
            Log.d("System","Call GetAppName")
    
            var vPackageManager = getApplicationContext().getPackageManager() //例外
            var apps = vPackageManager.getInstalledApplications(0)
    
            for (ai in apps) {
                if (packageName == ai.packageName) return ai.loadLabel(vPackageManager).toString()
            }
    
            return "error"
        }
    
        fun GetAppIcon(packageName: String): Drawable {
            Log.d("System","Call GetAppIcon")
    
            var vPackageManager = getApplicationContext().getPackageManager() //例外
            return vPackageManager.getApplicationIcon(packageName)
        }
    }
    
    data class NotificationData(val Title: String, val Text: String)
    //data class NotificationViewHolder(var AppIconView: ImageView, var titleView: TextView, var textView: TextView)
    
    class NotificationAdapter(context: Context, LogList:List<NotificationData>):ArrayAdapter<NotificationData>(context, 0, LogList) {
        private val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    
        override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
            Log.d("System","getView")
    
            val view = layoutInflater.inflate(R.layout.loglist,parent,false)
    
            val AppIconView = view.findViewById<ImageView>(R.id.AppIconView)
            val titleView=view.findViewById<TextView>(R.id.titleView)
            val textView=view.findViewById<TextView>(R.id.textView)
    
            val main = MainActivity()
    
            Log.d("System","Set Data")
    
            AppIconView.setImageDrawable(main.GetAppIcon(super.getItem(position).Title))
            titleView.text = super.getItem(position).Title
            textView.text = main.GetAppName(super.getItem(position).Text)
    
            return view
        }
    }
    
[/code]

Loading.kt

[code]

    package caios.android.notification_log
    
    import android.content.Intent
    import android.content.pm.PackageManager
    import android.graphics.drawable.Drawable
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import android.util.Log
    import android.widget.Toast
    import kotlinx.android.synthetic.main.activity_loading.*
    import kotlinx.android.synthetic.main.activity_main.*
    import java.io.BufferedReader
    import java.io.File
    import java.io.Serializable
    import kotlin.concurrent.thread
    
    class Loading : AppCompatActivity() {
    
        private var NotificationName: ArrayList<String> = arrayListOf()
        private var NotificationText: ArrayList<String> = arrayListOf()
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_loading)
    
            Log.d("System","Call Loading.kt")
    
            thread {
                CreateList()
            }
        }
    
        fun CreateList() {
            var inputStream = File(filesDir, "LogDateCount.txt")
    
            if (inputStream.exists()) {
                var FileCount = inputStream.bufferedReader().use(BufferedReader::readText)
                var i: Int = FileCount.toInt() - 1
    
                progressMark.visibility = android.widget.ProgressBar.VISIBLE
                progressBar.max = FileCount.toInt()
    
                Log.d("System","Count = $i")
    
                while (i > 0) {
                    val FileName = "LogDate" + i + ".txt"
                    inputStream = File(filesDir, FileName)
    
                    Log.d("System","Open $FileName")
    
                    if (!inputStream.exists()) {
                        Toast.makeText(this, "ERROR:指定されたファイルが見つかりません $FileName", Toast.LENGTH_SHORT).show()
                    } else {
                        val TempText = inputStream.bufferedReader().use(BufferedReader::readText)
                        val array = TempText.split("\n")
                        NotificationName.add(array[0])
                        NotificationText.add(array[1])
    
                        Log.d("System","Name = ${array[0]} Text = ${array[1]}")
    
                        progressBar.progress = FileCount.toInt() - i
                        LoadText.text = (FileCount.toInt() - i).toString() + " / " + FileCount
                    }
                    i--;
                }
    
                Log.d("System","Load loop break")
    
                val intent = Intent(this, MainActivity::class.java)
    
                intent.putExtra("Name", NotificationName)
                intent.putExtra("Text", NotificationText)
                intent.putExtra("FileCount", FileCount.toInt() - 1)
    
                Log.d("System","Set Intent")
    
                startActivity(intent)
    
                Log.d("System","Start MainActivity")
            } else {
                finish()
    
                Log.d("System","finish")
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2019-07-06T09:31:39.910
56452
2019-07-17T10:41:05.183
2019-07-06T09:37:13.650
question
android kotlin
KotlinでNullPointerExceptionが発生する


NotificationAdapterの中で新しいMainActivityを作ってしまっています。  
`val main = MainActivity()`  
getApplicationContext()がnullになっているのはこの新しいMainActivityの方です。

解決策ですが、  
`val main = MainActivity()`  
の行は削除し、  
`class NotificationAdapter(context: Context`  
を  
`class NotificationAdapter(context: MainActivity`  
と変更し、  
`context.GetAppIcon`  
と呼ぶようにしてみてください。  
たぶん、動くと思います。

これはこれで問題をはらんでいますが、とりあえず動くと思いますので、どんどん良いアプリにしていってください。


CC BY-SA 4.0
2019-07-17T10:41:05.183
56704
2019-07-17T10:41:05.183
354
56452
answer