如何从Firebase读取文本文件到Android应用程序

时间:2017-07-27 12:13:57

标签: android firebase firebase-authentication kotlin firebase-storage

我正在使用基于内容的Android App.I使用Firebase上传所有文本文件(在rtf或doc文件中)。在我将一个文本文件上传到Firebase后,我创建了一个详细的活动,从firebase下载文件但是文本文件没有被读取,它什么也没有显示。这是我的Kotlin代码...

class detailOne : AppCompatActivity() {

    private var mTextView : TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.detailone)

        val myButton = findViewById(R.id.butOne) as Button
        mTextView = findViewById(R.id.myText) as TextView

        FirebaseApp.initializeApp(this)
        val storage = FirebaseStorage.getInstance()
        val storageRef = storage.getReferenceFromUrl("gs://yehwot-eta.appspot.com/story.rtf")


        try {
            val localFile = File.createTempFile("text", "rtf")
                storageRef.getFile(localFile).addOnSuccessListener {

                }.addOnFailureListener {
                    print("Connection is Lost!Please Try Again")
                }
            }
        } catch(e : IOException) {
            e.printStackTrace()
        }

        myButton.setOnClickListener {
            val myIntent = Intent()
            myIntent.action = Intent.ACTION_SEND
            myIntent.type = "text/plain"               
            myIntent.putExtra(Intent.EXTRA_TEXT,"This is my Text")
            startActivity(myIntent)
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我有答案!为了使用文本文件,我不必加载到Firebase Storage.Instead我直接上传到Json格式的Firebase数据库。

答案 1 :(得分:0)

您可以将文件加载到Firebase存储中。这是允许在回收站视图内由Kotlin android应用程序片段“下载”并使用制表符分隔的文本文件的代码:

    // get the file from firebase
    val storage = FirebaseStorage.getInstance()
    var storageRef = storage.reference
    val seriesRef = storageRef.child("YourFileName.txt")

    val localFile = File.createTempFile("YourFileName", "txt")

    seriesRef.getFile(localFile).addOnSuccessListener {
        // Local temp file has been created
        activity?.let { fragmentActivity ->
            try {
                val lines: List<String> = localFile.readLines()
                localFile.delete()

                lines.forEach { seriesString ->
                    // check for header row
                    if (seriesString.contains(kSeriesHeaderString, true)) {
                        // do nothing for the header string
                    } else {
                        // set the image id
                        val series =
                            Series(
                                seriesString
                            )

                        series.imageId = resources.getIdentifier(
                            series.logoImageName.toLowerCase(Locale.ROOT), "drawable",
                            fragmentActivity.packageName
                        )

                        SeriesList.addSeries(series)
                    }
                }

                // get all series and set the series list
                seriesList = SeriesList.getAllSeries()
                seriesListRecyclerView.adapter?.notifyDataSetChanged()

            } catch (e: Exception) {
                Log.e(TAG, "-------------------------------------------------------")
                Log.e(TAG, "ERROR: failed to read series file, stacktrace to follow.")
                Log.e(TAG, "-------------------------------------------------------")
                e.printStackTrace()
            }
        }
    }.addOnFailureListener {
        Log.e(TAG, "Failed to read $kStarWarsSeriesFileName: ${it.message}")
        Toast.makeText(view?.context, "Failed to read $kStarWarsSeriesFileName:: ${it.message}", Toast.LENGTH_LONG).show()
    }

此代码获取应用程序的firebase实例,并获取对该文件的引用。我的文件位于Firebase存储的根目录中。

文件保存在本地存储中。

如果标题存在,则逐行读取文件,跳过标题记录。

上一行后,删除了localFile,因为我不再需要保留该文件。就我而言,每次加载应用程序时都需要检索文件。

文件中的每一行都用于创建必要的“系列”实例

然后返回所有系列实例

尝试/捕获和异常处理也得到管理。