ACTION_CREATE_DOCUMENT 根据 url 响应写一个 pdf 文件,android?
ACTION_CREATE_DOCUMENT write a pdf file from url response, android?
我正在使用共享存储来编写 pdf 文件。文件已创建,但它是 0 字节。
无法理解问题所在。
下面是我的代码
ACTION_CREATE_DOCUMENT
fun saveFile() {
val exportIntent = Intent(Intent.ACTION_CREATE_DOCUMENT)
exportIntent.addCategory(Intent.CATEGORY_OPENABLE)
exportIntent.type = "application/pdf"
val filename = "test.pdf"
exportIntent.putExtra(Intent.EXTRA_TITLE, filename)
startForResult.launch(exportIntent)
}
Activity 结果
private val MEGABYTE = 1024 * 1024
val startForResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
val intent = result.data
if (intent?.data != null) {
val uri: Uri = intent.data!!
GlobalScope.launch {
writeFile(uri)
}
}
}
}
写文件方法
fun writeFile(uri:Uri){
val outputStream: OutputStream? =
requireContext().contentResolver.openOutputStream(uri)
if (outputStream != null) {
val url = URL(some url)
val urlConnection: HttpURLConnection =
url.openConnection() as HttpURLConnection
urlConnection.setRequestMethod("GET")
urlConnection.setDoOutput(true)
urlConnection.connect()
val inputStream: InputStream = urlConnection.getInputStream()
val buffer = ByteArray(MEGABYTE)
var bufferLength = 0
while (inputStream.read(buffer).also { bufferLength = it } > 0) {
outputStream.write(buffer, 0, bufferLength)
}
outputStream.close()
}
}
通过记录 inputStream.available() 检查输入流是否可访问
必须 >0
使用此逻辑将输入流写入输出流
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.close()
感谢@blackapps 的评论才得以解决
删除了以下内容
urlConnection.setRequestMethod("GET")
urlConnection.setDoOutput(true)
正确的函数变为
fun writeFile(uri: Uri, docUrl: String) {
val outputStream: OutputStream? =
requireContext().contentResolver.openOutputStream(uri)
if (outputStream != null) {
val url =
URL(docUrl)
val urlConnection: HttpURLConnection =
url.openConnection() as HttpURLConnection
urlConnection.connect()
val inputStream: InputStream = urlConnection.getInputStream()
val buffer = ByteArray(1024 * 1024)
var bufferLength = 0
while (inputStream.read(buffer).also { bufferLength = it } > 0) {
outputStream.write(buffer, 0, bufferLength)
}
outputStream.close()
}
}
我正在使用共享存储来编写 pdf 文件。文件已创建,但它是 0 字节。 无法理解问题所在。
下面是我的代码
ACTION_CREATE_DOCUMENT
fun saveFile() { val exportIntent = Intent(Intent.ACTION_CREATE_DOCUMENT) exportIntent.addCategory(Intent.CATEGORY_OPENABLE) exportIntent.type = "application/pdf" val filename = "test.pdf" exportIntent.putExtra(Intent.EXTRA_TITLE, filename) startForResult.launch(exportIntent) }
Activity 结果
private val MEGABYTE = 1024 * 1024 val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode == Activity.RESULT_OK) { val intent = result.data if (intent?.data != null) { val uri: Uri = intent.data!! GlobalScope.launch { writeFile(uri) } } } }
写文件方法
fun writeFile(uri:Uri){ val outputStream: OutputStream? = requireContext().contentResolver.openOutputStream(uri) if (outputStream != null) { val url = URL(some url) val urlConnection: HttpURLConnection = url.openConnection() as HttpURLConnection urlConnection.setRequestMethod("GET") urlConnection.setDoOutput(true) urlConnection.connect() val inputStream: InputStream = urlConnection.getInputStream() val buffer = ByteArray(MEGABYTE) var bufferLength = 0 while (inputStream.read(buffer).also { bufferLength = it } > 0) { outputStream.write(buffer, 0, bufferLength) } outputStream.close() } }
通过记录 inputStream.available() 检查输入流是否可访问 必须 >0
使用此逻辑将输入流写入输出流
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.close()
感谢@blackapps 的评论才得以解决 删除了以下内容
urlConnection.setRequestMethod("GET")
urlConnection.setDoOutput(true)
正确的函数变为
fun writeFile(uri: Uri, docUrl: String) {
val outputStream: OutputStream? =
requireContext().contentResolver.openOutputStream(uri)
if (outputStream != null) {
val url =
URL(docUrl)
val urlConnection: HttpURLConnection =
url.openConnection() as HttpURLConnection
urlConnection.connect()
val inputStream: InputStream = urlConnection.getInputStream()
val buffer = ByteArray(1024 * 1024)
var bufferLength = 0
while (inputStream.read(buffer).also { bufferLength = it } > 0) {
outputStream.write(buffer, 0, bufferLength)
}
outputStream.close()
}
}