当前位置: 首页 > 知识库问答 >
问题:

如何保存互联网图像与网址在SD卡(Android静态编程语言)

麹学文
2023-03-14

我的代码有错误(

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter result)

没有保存图像我会给你所有的代码:

主活动代码:

package com.masreta87.backhussian

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.masreta87.backhussian.models.BlogPost
import com.masreta87.backhussian.models.DataSource
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
private lateinit var blogAdapter:BlogRecyclerAdapter
    lateinit var data: List<BlogPost>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initRecyclerView()
        addDataSet()

    }
    private fun addDataSet(){
        data=DataSource.createDataSet()
        blogAdapter.submitList(data)
    }
    private fun initRecyclerView(){
        recycler_view.apply {
            layoutManager=LinearLayoutManager(this@MainActivity)
            blogAdapter=BlogRecyclerAdapter()
            adapter=blogAdapter
        }

    }
}

博客回收dapter.kt

    package com.masreta87.backhussian

import android.content.Context
import android.graphics.Bitmap
import android.os.AsyncTask
import android.os.Environment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.masreta87.backhussian.models.BlogPost
import kotlinx.android.synthetic.main.layout_blog_list_item.view.*
import java.net.URL
import android.os.Environment.getExternalStorageDirectory
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy
import java.io.File
import java.io.FileOutputStream
import java.lang.ref.WeakReference
import android.widget.Toast
import android.content.Intent
import android.annotation.SuppressLint
import android.app.ProgressDialog
import android.net.Uri
import com.squareup.picasso.Picasso
import java.io.IOException


class BlogRecyclerAdapter :RecyclerView.Adapter<RecyclerView.ViewHolder>(){
    private  var items:List <BlogPost> = ArrayList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return  BlogViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.layout_blog_list_item,parent,false)

        )
    }

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

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when(holder){

            is BlogViewHolder ->{
                holder.bind(items.get(position))
            }
        }
    }
    fun submitList(blogList: List<BlogPost>){
        items = blogList
    }
    class BlogViewHolder constructor(
        itemView:View

    ):RecyclerView.ViewHolder(itemView){
        val blogImage:ImageView =itemView.blog_image
        fun bind(blogPost:BlogPost){
            val requestOptions =RequestOptions()
                .placeholder(R.drawable.ic_launcher_background)
                .error(R.drawable.ic_launcher_background)
            Glide.with(itemView.context)
                .applyDefaultRequestOptions(requestOptions)
                .load(blogPost.image)
                .into(blogImage)
            itemView.setOnClickListener{
                SaveImage(itemView.context,blogPost.image.toString() );
            }

        }

    }


}

private fun SaveImage(context: Context, MyUrl: String) {
    val progress = ProgressDialog(context)

    class SaveThisImage : AsyncTask<Void, Void, Void>() {
        override fun onPreExecute() {
            super.onPreExecute()
            progress.setTitle("Processing")
            progress.setMessage("Please Wait...")
            progress.setCancelable(false)
            progress.show()
        }

        override fun doInBackground(vararg arg0: Void): Void? {
            try {

                val sdCard = Environment.getExternalStorageDirectory()
                @SuppressLint("DefaultLocale") val fileName =
                    String.format("%dm.png", System.currentTimeMillis())
                val dir = File(sdCard.absolutePath + "/Image")
                dir.mkdirs()
                val myImageFile = File(dir,fileName) // Create image file
                **var fos:FileOutputStream? = null**
                try {
                    Log.d("ala",myImageFile.toString())
                    **fos = FileOutputStream(myImageFile)**

                    val bitmap = Picasso.get().load(MyUrl).get()
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)

                    val intent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
                    intent.data = Uri.fromFile(myImageFile)
                    context.sendBroadcast(intent)
                } catch (e: IOException) {
                    e.printStackTrace()
                } finally {
                    try {
                        fos!!.close()
                    } catch (e: IOException) {
                        e.printStackTrace()
                    }

                }
            } catch (e: Exception) {
            }

            return null
        }

        override fun onPostExecute(result: Void) {
            super.onPostExecute(result)
            if (progress.isShowing) {
                progress.dismiss()
            }
            Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show()
        }
    }

    val shareimg = SaveThisImage()
    shareimg.execute()
}

还有博客ost.class

    package com.masreta87.backhussian.models

data class BlogPost(

                  var image:String

)

{

}

和DataStore.class

    package com.masreta87.backhussian.models


class DataSource{

    companion object{

        fun createDataSet(): ArrayList<BlogPost>{
            val list = ArrayList<BlogPost>()
            list.add(
                BlogPost(
                    "https://firebasestorage.googleapis.com/v0/b/databaseim-56ef5.appspot.com/o/rpic%20(2).jpg?alt=media&token=138c2c3b-33ce-4a96-a7f5-74816af21809"
                )
            )
            list.add(
                BlogPost(
                    "https://firebasestorage.googleapis.com/v0/b/databaseim-56ef5.appspot.com/o/v1.png?alt=media&token=2e80d218-eb48-4c51-b51a-0fac43f76da7"
                )
            )

            list.add(
                BlogPost(
                    "https://firebasestorage.googleapis.com/v0/b/databaseim-56ef5.appspot.com/o/v10.jpg?alt=media&token=5e7207eb-1dac-41c0-bb3b-95abf9a54a2e"
                )
            )
            list.add(
                BlogPost(
                    "https://firebasestorage.googleapis.com/v0/b/databaseim-56ef5.appspot.com/o/v11.jpg?alt=media&token=2ab2b0c4-5ca1-4042-85c5-6d3e58181f45"
                )
            )

            return list
        }
    }
}

最主要的

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

还有activity_main.xml

    <?xml vershtml" target="_blank">ion="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:id="@+id/recycler_view"/>

</androidx.constraintlayout.widget.ConstraintLayout>

和layout_blog_list_item.xml

   <?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardElevation="10dp"
    app:cardCornerRadius="2dp"
    app:cardPreventCornerOverlap="false"
    >

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="610dp"
            app:layout_constraintTop_toTopOf="parent"
            android:id="@+id/blog_image"
            android:background="@drawable/boder_image"
            android:padding="10dp"
            android:layout_margin="0dp"
            android:adjustViewBounds="true"
            android:scaleType="fitXY"
            />






    </androidx.constraintlayout.widget.ConstraintLayout>


</androidx.cardview.widget.CardView>

和完全错误:

2020-01-15 21:34:36.509 32083-32083/? E/AndroidRuntime:致命异常:主进程:com.masreta87.backhussian,PID:32083 java.lang.IllegalArgumentException:指定为非null的参数为null:method kotlin.jvm.internal.Intrinsics.checkParametersNotnull,参数结果位于com.masreta87.backhussian.BlogRecyclerAdapterKt$SaveImage$SaveThisImage.onPostExecute(未知源:2)android.os.Handler.dispatchMessage(Handler.java:105)上的com.masreta87.backhussian.BlogRecyclerAdapterKt$SaveImage$SaveThisImage.onPostExecute(BlogRecyclerAdapter.kt:86)和android.os.AsyncTask.finish(AsyncTask.java:695)上的android.app.ActivityThread.main(ActivityThread.java:6541)的android.os.Looper.loop(Looper.java:164)和java.lang.reflect.Method.invoke(Native Method)的com.android.internal.os.zyote$MethodAndArgsCaller.run(zyote.java:240)的com.android.internal.os.zyoteinit.java:767

这是应用程序中的完全错误

共有1个答案

鲁辉
2023-03-14

更改参数类型

重写onPostExecute(结果:Void)

重写onPostExecute(结果:Void?)

正如Akhilesh Kumar在这里提到的,你也应该改变

class SaveThisImage:AsyncTask

class SaveThisImage:AsyncTask

这是因为代码中的doInBackground返回可为空的类型Void?doInBackground的返回值作为参数传递给onPostExcecute,但是您的onPostExecute接受非空值Void而不是可空值Void?

作为旁注,在Kotlin中时,您应该使用Unit而不是Void

编辑

要使保存的图像显示,需要更新媒体数据库。媒体数据库会在您重启设备时更新,或者在一段时间后,它会显示在保存位置。要立即更新媒体数据库,可以使用MediaScannerConnection对象

尝试在位图之后将保存的文件传递到此函数。压缩并传递myImageFile

/**
 * Updates the Pictures gallery to include the newly created file.
 * @param fileObj: file path to be scanned so that the new file will appear in the gallery
 */
private fun refreshPhoneGallery(fileObj: File)
{

    /* Scan the specified file path so that the new file will appear in gallery */
    MediaScannerConnection.scanFile(
        yourContext,
        arrayOf(fileObj.path),
        null,
        object : MediaScannerConnection.OnScanCompletedListener
        {
            override fun onScanCompleted(scannedFilePath: String?, p1: Uri?)
            {
                // Do whatever
            }
        }
    )
}

 类似资料:
  • 问题内容: 我尝试使用此代码下载图像并将其保存在以下行中: 我在emulator.my应用程序上尝试了此操作,但出现异常,没有权限保存到此路径: 我也添加了这一行: 这是代码: 问题答案:

  • 问题内容: 发送电子邮件的代码如下: 我的问题是,正如我在utf-8中编码主题一样,我如何编码收件人地址,即。 问题答案: JavaMail的MimeMessage使用InternetAddress: 此类表示使用RFC822语法的Internet电子邮件地址。典型的地址语法格式为“ user@host.domain”或“个人名称user@host.domain”。 RFC822格式说: 请注意,

  • 地址 # ipaddress_addresses.py import binascii import ipaddress ADDRESSES = [ '10.9.0.6', 'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa', ] for ip in ADDRESSES: addr = ipaddress.ip_address(ip)

  • 问题内容: 像往常一样,在使用Volley之前,我使用AsyncTask来检查我的互联网状态。 这是我在AsyncTask中所做的: 这是函数: 如何使用Volley实现这一目标? 问题答案: 没有为该请求引发的NoConnection错误。请捕捉错误

  • 目前,我的(使用的是Stackoverflow,我自己没有完整地编写)代码如下所示: 我得到错误:“打开失败;EACCES(权限被拒绝)”。 我的舱单是这样的:

  • 当我运行progressdialog出现在屏幕上时,它突然停止运行,并发出通知“应用程序停止了,再试一次”,然后我在android manitor上重复了这个错误,当然我首先要做的是: