在使用Android中使用ContentResolver保存文件时面对问题-Kotlin
经过4年的差距,我回到了Android。引入了许多新事物。面对一个问题,同时将Excel文件保存到用户的默认下载文件夹中。请参阅下面的详细信息:
步骤1-在AndroidManifest.xml(获得许可)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
步骤2-初始化
if (isStoragePermissionGranted()) {
val applicationContext = this.baseContext
val data = createWorkbook(this.memberList).toString()
writeToFile(applicationContext,fileName,data)
}
isStoragePermissiongranted()
方法的写入功能详细信息。
private fun isStoragePermissionGranted(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
//Permission is granted
true
} else {
//Permission is revoked
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),1
)
false
}
} else {
//permission is automatically granted on sdk<23 upon installation
//Permission is granted
true
}
}
writetofile()
方法的详细信息。
fun writeToFile(applicationContext: Context, filename: String, data: String) {
try {
val resolver = applicationContext.contentResolver
val values = ContentValues()
values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
values.put(MediaStore.MediaColumns.MIME_TYPE, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
val uri = resolver.insert(MediaStore.Files.getContentUri("external"), values)
//val cr: ContentResolver = getContentResolver()
val os: OutputStream? = uri?.let { resolver.openOutputStream(it, "wt") }
if (os != null) {
os.write(data.toByteArray())
os.flush()
os.close()
}
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
}
createworkbook
方法的详细信息。
private fun createWorkbook(memberList: ArrayList<CommitteeMember>): Workbook {
// Creating a workbook object from the XSSFWorkbook() class
val ourWorkbook = XSSFWorkbook()
//Creating a sheet called "statSheet" inside the workbook and then add data to it
val sheet: Sheet = ourWorkbook.createSheet("statSheet")
addData(sheet, memberList)
return ourWorkbook
}
我遇到以下错误。请建议我出错的地方。谢谢!
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.agartalatoday.bjymconnect, PID: 4991
java.lang.IllegalArgumentException: no path was provided when inserting new file
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
at android.content.ContentResolver.insert(ContentResolver.java:1729)
at com.agartalatoday.bjymconnect.BaseActivityClass.writeToFile(BaseActivityClass.kt:106)
at com.agartalatoday.bjymconnect.BaseActivityClass.saveData(BaseActivityClass.kt:93)
at com.agartalatoday.bjymconnect.fragments.CommitteeListViewFragment$onCreateView$1.onClick(CommitteeListViewFragment.kt:64)
at android.view.View.performClick(View.java:6642)
at android.view.View.performClickInternal(View.java:6619)
at android.view.View.access$3100(View.java:790)
at android.view.View$PerformClick.run(View.java:26189)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7147)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:511)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876)
I/Process: Sending signal. PID: 4991 SIG: 9
I am back to android after a gap of 4 years. So many new things have been introduced. Facing one issue while saving an excel file to the user's default download folder. Please see below the details:
Step 1 - in AndroidManifest.xml (getting permission)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Step 2 - initializing the write function
if (isStoragePermissionGranted()) {
val applicationContext = this.baseContext
val data = createWorkbook(this.memberList).toString()
writeToFile(applicationContext,fileName,data)
}
Details of isStoragePermissionGranted()
method.
private fun isStoragePermissionGranted(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
//Permission is granted
true
} else {
//Permission is revoked
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),1
)
false
}
} else {
//permission is automatically granted on sdk<23 upon installation
//Permission is granted
true
}
}
Details of writeToFile()
method.
fun writeToFile(applicationContext: Context, filename: String, data: String) {
try {
val resolver = applicationContext.contentResolver
val values = ContentValues()
values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
values.put(MediaStore.MediaColumns.MIME_TYPE, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
val uri = resolver.insert(MediaStore.Files.getContentUri("external"), values)
//val cr: ContentResolver = getContentResolver()
val os: OutputStream? = uri?.let { resolver.openOutputStream(it, "wt") }
if (os != null) {
os.write(data.toByteArray())
os.flush()
os.close()
}
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
}
Details of createWorkbook
method.
private fun createWorkbook(memberList: ArrayList<CommitteeMember>): Workbook {
// Creating a workbook object from the XSSFWorkbook() class
val ourWorkbook = XSSFWorkbook()
//Creating a sheet called "statSheet" inside the workbook and then add data to it
val sheet: Sheet = ourWorkbook.createSheet("statSheet")
addData(sheet, memberList)
return ourWorkbook
}
I am getting the following error. Please suggest where I am going wrong. Thanks!
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.agartalatoday.bjymconnect, PID: 4991
java.lang.IllegalArgumentException: no path was provided when inserting new file
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
at android.content.ContentResolver.insert(ContentResolver.java:1729)
at com.agartalatoday.bjymconnect.BaseActivityClass.writeToFile(BaseActivityClass.kt:106)
at com.agartalatoday.bjymconnect.BaseActivityClass.saveData(BaseActivityClass.kt:93)
at com.agartalatoday.bjymconnect.fragments.CommitteeListViewFragment$onCreateView$1.onClick(CommitteeListViewFragment.kt:64)
at android.view.View.performClick(View.java:6642)
at android.view.View.performClickInternal(View.java:6619)
at android.view.View.access$3100(View.java:790)
at android.view.View$PerformClick.run(View.java:26189)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7147)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:511)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876)
I/Process: Sending signal. PID: 4991 SIG: 9
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论