简体   繁体   English

如何从网址下载pdf,内部存储并打开它:使用kotlin的Android Studio

[英]how to download pdf form a url, to internal storage and open it : Android studio using kotlin

class Eco9 : AppCompatActivity() {

    lateinit internal var uri: Uri

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_eco9)
        this.getActionBar();
        this.supportActionBar!!.title = "Class 9th Economics";

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()
        }
        supportActionBar?.setDisplayHomeAsUpEnabled(true)

       val openActivityDownload: Button = findViewById(R.id.eco9ch1)
        openActivityDownload.setOnClickListener {
            val s = "https://drive.google.com/file/d/0B71LXrqWr0mFUTk5WnVyVEQ3MFE/export?format=pdf"
            val fname = "123.pdf"
            if (FileExists(fname)) { previewpdf(fname) }
            else { download(s)
                Toast.makeText(applicationContext, "File will download", Toast.LENGTH_LONG).show()
            }
        }

    }

    fun FileExists(name: String): Boolean {
        val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + separator + name)
        return file.exists()
    }

    private fun download(s: String) {
        val downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
        val uri = Uri.parse(s)
        val request = DownloadManager.Request(uri)
        val nameOfFile = URLUtil.guessFileName(uri.toString(), null, MimeTypeMap.getFileExtensionFromUrl(uri.toString()))
        val destinationInExternalPublicDir = request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS)
        request.setAllowedOverMetered(true)
        request.setAllowedOverRoaming(true)
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
        request.allowScanningByMediaScanner()
        downloadManager.enqueue(request)
    }

    private fun previewpdf(name: String) {
       val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + separator + name)
       val path = fromFile(file)
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        val intent = Intent(Intent.ACTION_VIEW, path)

        val chooser = Intent.createChooser(intent, "Open with")
        if (intent.resolveActivity(packageManager) != null)
            startActivity(chooser)
        else
            Toast.makeText(applicationContext, "No suitable application to open file", Toast.LENGTH_LONG).show()
    }
}

I want to download a pdf from given url (s), I am pressing button named "echo9ch1", and calling function download(s) if file is not present in internal public download folder and otherwise if it is present, it should open pdf, not download it again. 我想从给定的URL下载pdf,按下名为“ echo9ch1”的按钮,如果内部公共下载文件夹中不存在文件,则调用函数download(s),否则,应打开pdf ,无需再次下载。 Where am i missing ? 我在哪里想念? I can open 123.pdf, which was downloaded earlier. 我可以打开先前下载的123.pdf。 but I deleted my pdf file and download function is not working now . 但是我删除了pdf文件, 下载功能现在无法使用 Actually a small problem came, as i was playing with code in download function.Help me with download() function, and see preview() and fileExists() function also. 其实一个小问题就来了,因为我是用代码打在下载function.Help我下载()函数,并看到预览()和FILEEXISTS()函数也。 I added permissions in manifest.xml also. 我也在manifest.xml中添加了权限。 And I want to download pdf without wifi also. 我也想下载没有wifi的pdf文件。

Manifest permissions are : 清单权限为:

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

For download you have to use async task. 要下载,您必须使用异步任务。

like in this example I am downloading mutliple file it can be PDF, Image etc 像本例中一样,我正在下载mutliple文件,它可以是PDF,Image等

class DownloadFileAsync(paths: Array<String?>, listener: AsyncResponse?, size: Int) : AsyncTask<String, String, Array<String?>>() {
    private val listener: AsyncResponse? = listener
    var current = 0
    var paths: Array<String?>
    val downPaths = arrayOfNulls<String>(size)

    lateinit var fpath: String
    var show = false


    init {
        this.paths = paths
    }


    protected override fun onPreExecute() {
        super.onPreExecute()
    }

    protected override fun doInBackground(vararg aurl: String): Array<String?> {
        val rows = aurl.size
        while (current < rows) {
            var count: Int
            try {
                println("Current: " + current + "\t\tRows: " + rows)
                fpath = getFileName(this.paths[current]!!)
                val url = URL(this.paths[current])
                val conexion = url.openConnection()
                conexion.connect()
                val lenghtOfFile = conexion.getContentLength()
                val input = BufferedInputStream(url.openStream(), 512)
                val file = File(Environment.getExternalStorageDirectory().path.plus(File.separator).plus(fpath))
                downPaths.set(current, file.absolutePath)
                if (!file.exists()) file.createNewFile()
                val output = FileOutputStream(file)
                val data = ByteArray(512)
                var total: Long = 0
                while (true) {
                    count = input.read(data)
                    if (count == -1) break
                    total += count
                    output.write(data, 0, count)
                }


                show = true
                output.flush()
                output.close()
                input.close()
                current++
            } catch (e: Exception) {
                Log.d("Exception", "" + e)
            }
        } // while end
        onPostExecute(downPaths)
        return downPaths
    }

    override fun onProgressUpdate(progress: Array<String?>) {

    }

    override fun onPostExecute(result: Array<String?>) {
        listener?.processFinish(result)
    }

    private fun getFileName(wholePath: String): String {
        var name: String? = null
        val start: Int
        val end: Int
        start = wholePath.lastIndexOf('/')
        end = wholePath.length //lastIndexOf('.');
        name = wholePath.substring((start + 1), end)
        return name
    }
}

After that I am geting the call back of file path via interface listener?.processFinish(result) 之后,我通过接口侦听器获取文件路径的回调?.processFinish(result)

Note: Maybe I should use comment section for this, but my reputation is still low so... 注意:也许我应该为此使用注释部分,但是我的声誉仍然很低,所以...

I try running your code, the only thing missing is on the download function. 我尝试运行您的代码,唯一缺少的是下载功能。 It should be: 它应该是:

 val destinationInExternalPublicDir = request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, nameOfFile)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 Android Studio 中使用 Volley 在内部存储中下载文件? - How to Download file in internal Storage using Volley in Android Studio? 我们如何从Firebase下载Android Studio中的文件(pdf),使其不出现在手机的内部存储中? - How can we download file(pdf) in android studio from firebase such that it doesn't appear in phone's internal storage? 如何使用 android studio 删除 android 应用程序中的内部存储文件? - How to delete internal storage file in android app using android studio? (Android Studio)如何将位图保存到内部存储? - (Android Studio) How to save bitmap to Internal Storage? 如何使用 URL 一键将多张图像下载到设备内部存储 - How to download multiple images using URL to device internal storage with one button click 如何从 firebase 存储链接在我的应用程序(android studio,JAVA)中打开 pdf 文件 - How to open pdf file inside my app (android studio, JAVA) from firebase storage link 如何使用 PdfRenderer 从 Android 应用程序内的内部存储中渲染 PDF 文件 - How to render PDF file from Internal storage inside Android App using PdfRenderer 如何使用 kotlin 在内部存储中创建文件夹和文件 - how to create a folder and file in internal storage using kotlin Android Studio Gson 到内部存储 - Android Studio Gson to Internal Storage 使用Android Studio在内部存储中创建目录和文件夹 - Creating a directory and folder in the internal storage using android studio
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM