Kotlin. Не показывает файлы в каталоге

#kotlin

#kotlin

Вопрос:

Добрый вечер! Я не могу выводить файлы в определенном каталоге на устройстве Android, и я не могу это решить. Вот программный код

 package com.example.nt_music
 
import android.os.Bundle
import android.os.Environment
import androidx.appcompat.app.AppCompatActivity
import java.io.File
import java.util.*
 
 
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        println()
        //readSongs(dir, ext)
 
        val gpath: String = Environment.getExternalStorageDirectory().absolutePath
        val spath = "Music"
        val fullpath = File(gpath   File.separator   spath)
        println("fullpath")
        println(fullpath)
        imageReaderNew(fullpath)
 
    }
    fun imageReaderNew(root: File) {
        val fileList: ArrayList<File> = ArrayList()
        val listAllFiles = root.listFiles()
        if (listAllFiles == null) println("null")
 
        if (listAllFiles != null amp;amp; listAllFiles.size > 0) {
            for (currentFile in listAllFiles) {
                if (currentFile.name.endsWith(".mp3")) {
                    // File absolute path
                    println("downloadFilePath")
                    println( currentFile.getAbsolutePath())
                    // File Name
                    println("downloadFileName")
                    println(currentFile.getName())
                    fileList.add(currentFile.absoluteFile)
                }
            }
            println("fileList")
            println(fileList.size)
        }
    }
}
  

в AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.nt_music">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">

        <activity
                android:name=".MainActivity"
                android:label="@string/app_name"
                android:launchMode="singleTop"
                android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>
  

Возможно, я что-то не так написал или что-то нужно добавить

вывод:

 I/System.out: fullpath
    /storage/emulated/0/Music
I/System.out: null
  

Но почему null !?
возможно, это как-то связано с этими ошибками, которые появляются в консоли

 E/libc: Access denied finding property "ro.vendor.df.effect.conflict"
E/Perf: Fail to get file list com.example.nt_music
E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
    Fail to get file list com.example.nt_music
    getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
  

Комментарии:

1. Вы уверены, что предоставили необходимые разрешения?

2. @LucaPizzini Как я могу это проверить?

3. См . Отредактированный ответ

Ответ №1:

Вы можете проверить требуемые разрешения программно, вызвав этот метод

 fun checkPermissions()
{
    this.onPermissionGranted = onPermissionGranted

    val ungrantedPermissions = requiredPermissionsStillNeeded()

    if (ungrantedPermissions.isEmpty()) {
        // All permission granted, you can list your files...
    } else {
        ActivityCompat.requestPermissions(activity, ungrantedPermissions, 1)
    }
}
  

Эта функция вызывает этот метод

 private fun requiredPermissionsStillNeeded(): Array<String>
{
    val permissions = HashSet<String>()

    for (permission in getRequiredPermissions()) {
        permissions.add(permission)
    }

    val i = permissions.iterator()

    while (i.hasNext()) {
        val permission = i.next()
        if (ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED) {
            i.remove()
        }
    }

    return permissions.toTypedArray()
}

private fun getRequiredPermissions(): Array<String>
{
    var permissions: Array<String>? = null

    try {
        permissions = activity.packageManager.getPackageInfo(activity.packageName, PackageManager.GET_PERMISSIONS).requestedPermissions
    } catch (e: PackageManager.NameNotFoundException) {
        e.printStackTrace()
    }

    return permissions?.clone() ?: arrayOf()
}
  

Наконец, вам нужно переопределить этот метод в вашей деятельности. Он вызывается рекурсивно, пока ваш пользователь не предоставит все разрешения, необходимые приложению.

 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    checkPermissions()
}
  

После этого ваше приложение должно иметь возможность отображать файлы в папке.

Редактировать

Это все функции, которые проверяют, предоставили ли пользователи вам требуемые разрешения.

Вы должны добавить их в свой класс MainActivity и отредактировать свой метод onCreate следующим образом

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
 
    println()
    //readSongs(dir, ext)
 
    checkPermissions() 
}
  

А затем вызовите функцию файла списка в checkPermissions() следующим образом

 fun checkPermissions()
{
    this.onPermissionGranted = onPermissionGranted

    val ungrantedPermissions = requiredPermissionsStillNeeded()

    if (ungrantedPermissions.isEmpty()) {
        val gpath: String = Environment.getExternalStorageDirectory().absolutePath
        val spath = "Music"
        val fullpath = File(gpath   File.separator   spath)
        println("fullpath")
        println(fullpath)
        imageReaderNew(fullpath)
    } else {
        ActivityCompat.requestPermissions(activity, ungrantedPermissions, 1)
    }
}
  

Комментарии:

1. Извините, я только недавно начал изучать язык. Что такое activity и onPermissionGranted? Являются ли они библиотеками? И в каком виде вводить разрешение в первом коде? Еще раз извините за количество вопросов