使用 Kotlin 从下载中访问 Pdf 文件名?

问题描述 投票:0回答:0

我正在尝试创建一个回收器视图,其中显示了 pdf 文件的文件名和 pdf 图标,但我无法这样做,我是 kotlin 的新手,我正在学习如何实现它,适用于 android 11 upwards.

这是我的代码 我的 Document.kt 类

`package com.example.securityapps

import PDFADAPTER
import android.Manifest
import android.R.attr.mimeType
import android.content.ContentUris
import android.content.pm.PackageManager
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.load.engine.executor.GlideExecutor.UncaughtThrowableStrategy.LOG
import com.loopj.android.http.AsyncHttpClient.log
import java.io.File


class Documents : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView
   //declare a variable for Transfer button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_documents)
        Log.println(Log.DEBUG,"this","Hello")
        // find Transfer button by id


        recyclerView = findViewById(R.id.recycler_view_pdf)
        recyclerView.layoutManager = GridLayoutManager(this, DOCUMENT_COLUMN_COUNT)

        // Check if permission is granted
        if (ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.READ_EXTERNAL_STORAGE
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            // Request permission if not granted
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                READ_EXTERNAL_STORAGE_REQUEST_CODE
            )
        } else {
            // Permission granted, load documents from gallery
            val documentPathList = getDocumentsFromDownloads()
              Log.println(Log.VERBOSE ,"moon",documentPathList.toString())
            val adapter = PDFADAPTER()
            adapter.PdfConvertor(this, documentPathList.map { File(it) })
            recyclerView.adapter = adapter
            recyclerView.adapter = adapter
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == READ_EXTERNAL_STORAGE_REQUEST_CODE) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission granted, load documents from gallery
                val documentPathList = getDocumentsFromDownloads()

                val adapter = PDFADAPTER()
                adapter.PdfConvertor(this, documentPathList.map { File(it) })
                recyclerView.adapter = adapter
                recyclerView.adapter = adapter
Log.println(Log.DEBUG,"this_is_not_working",documentPathList.toString())
                // Set visibility of Transfer button if at least one document is checked



            } else {
                // Permission denied
                // Show an error message or do nothing
                Log.println(Log.DEBUG,"permission","permission denied");
            }
        }
    }
    private fun getDocumentsFromDownloads(): List<String> {
        val documentList = mutableListOf<String>()

        val projection = arrayOf(
            MediaStore.Downloads._ID,
            MediaStore.Downloads.DISPLAY_NAME,
            MediaStore.Downloads.DATE_ADDED,
            MediaStore.Downloads.SIZE,
            MediaStore.Downloads.RELATIVE_PATH
        )

        val selection = "${MediaStore.Downloads.MIME_TYPE} = ? AND ${MediaStore.Downloads.RELATIVE_PATH} LIKE ?"
        val selectionArgs = arrayOf("application/pdf", "%Download%")

        val cursor: Cursor? = contentResolver.query(
            MediaStore.Downloads.EXTERNAL_CONTENT_URI,
            projection,
            selection,
            selectionArgs,
            null
        )

        cursor?.use {
            val idCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads._ID)
            val nameCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads.DISPLAY_NAME)
            val addedCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads.DATE_ADDED)
            val sizeCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads.SIZE)
            val pathCol = cursor.getColumnIndexOrThrow(MediaStore.Downloads.RELATIVE_PATH)

            while (cursor.moveToNext()) {
                val fileId = cursor.getLong(idCol)
                val fileUri: Uri = ContentUris.withAppendedId(MediaStore.Downloads.EXTERNAL_CONTENT_URI, fileId)
                val fileName = cursor.getString(nameCol)
                val dateAdded = cursor.getLong(addedCol)
                val size = cursor.getLong(sizeCol)
                val relativePath = cursor.getString(pathCol)
                val fullPath = "${Environment.getExternalStorageDirectory().path}/$relativePath/$fileName"
                documentList.add(fullPath)

            }
        }

        return documentList
    }




    companion object
    {
        private const val DOCUMENT_COLUMN_COUNT = 2
        private const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1000;
    }
}`

我的 PdfAdapter.kt 类 `

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.CheckBox
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.example.securityapps.R
import com.example.securityapps.Recycler_Adapter
import java.io.File

class PDFADAPTER() :
    RecyclerView.Adapter<PDFADAPTER.ViewHolder>() {
    private var context: Context? = null
    private lateinit var pdfFiles: List<File>

    fun PdfConvertor(context: Context, pdfFiles: List<File>) {
        this.context = context
        this.pdfFiles = pdfFiles
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val pdfCardView: CardView = itemView.findViewById(R.id.pdf_cardView)
        val pdfImage: ImageView = itemView.findViewById(R.id.pdf_image)
        val pdfName: TextView = itemView.findViewById(R.id.pdf_name)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view =
            LayoutInflater.from(parent.context).inflate(R.layout.activity_documents, parent, false)
        return ViewHolder(view)
    }

    override fun getItemCount(): Int {
        return pdfFiles.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val pdfFile = pdfFiles[position]
        holder.pdfName.text = pdfFile.nameWithoutExtension
        holder.pdfCardView.setOnClickListener {
            // TODO: handle click event
        }
    }
}

` 和 pdf_card_view.xml

`<?xml version="1.0" encoding="utf-8"?>

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_marginTop="8dp"
    android:id="@+id/pdf_cardView"
    android:layout_marginStart="8dp"
    app:cardElevation="8dp"
    app:cardCornerRadius="8dp"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="vertical"
        android:padding="8dp"
        android:id="@+id/linear_Pdf"
        >

        <ImageView
            android:id="@+id/pdf_image"
            android:layout_width="299dp"
            android:layout_height="133dp"
            android:layout_marginStart="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="5dp"
            android:src="@drawable/pdf_icons" />

        <TextView
            android:id="@+id/pdf_name"
            android:layout_width="384dp"
            android:layout_height="56dp"
            android:layout_marginStart="5dp"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:padding="6dp"
            android:scrollHorizontally="true"
            android:text="hello"
            android:textColor="@color/black"
            android:textSize="20dp" />



    </LinearLayout>


</androidx.cardview.widget.CardView>`

和 activity.xml 文件

`<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_pdf"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp" />

    <Button
        android:id="@+id/airdrop_button"

        android:layout_width="406dp"
        android:layout_height="98dp"

        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"

        android:layout_gravity="end|bottom"
        android:layout_marginStart="3dp"
        android:layout_marginTop="572dp"
        android:layout_marginEnd="2dp"
        android:layout_marginBottom="61dp"
        android:clipChildren="false"
        android:clipToPadding="false"
        android:text="@string/transfer" />

</RelativeLayout>

android kotlin pdf storage
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.