2021-06-23安卓使用byteArray對文件處理

因?yàn)樗{(lán)牙硬件的交互限制,不能走系統(tǒng)的藍(lán)牙文件傳輸方案,只能通過sendmessage的方式,對需要對文件切片傳輸,
下面是byte數(shù)組的一些可用的處理:

  1. 首先因?yàn)榘沧孔钚碌南拗疲枰獙ξ募x寫權(quán)限手動(dòng)申請:
    在AndroidManifest清單文件中:
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

在Activity中:

  val PERMISSIONS_STORAGE = arrayOf(
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
   )

 private fun verifyStoragePermissions() {
        PERMISSIONSLIST.clear() //清空已經(jīng)允許的沒有通過的權(quán)限
        //逐個(gè)判斷是否還有未通過的權(quán)限
        for (i in PERMISSIONS_STORAGE.indices) {
            if (ContextCompat.checkSelfPermission(
                    this,
                    PERMISSIONS_STORAGE[i]
                ) !==
                PackageManager.PERMISSION_GRANTED
            ) {
                Log.d("bmc", "PERMISSIONS_STORAGE:" + PERMISSIONS_STORAGE[i])
                PERMISSIONSLIST.add(PERMISSIONS_STORAGE[i]) //添加還未授予的權(quán)限到mPermissionList中
            }
        }

        //申請權(quán)限
        if (PERMISSIONSLIST.size > 0) { //有權(quán)限沒有通過,需要申請
            ActivityCompat.requestPermissions(
                this, PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
            )
        } else {
            jumpTo(MainActivity::class.java)
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        var hasPermissionDismiss = false //有權(quán)限沒有通過
        if (REQUEST_EXTERNAL_STORAGE == requestCode) {
            for (i in grantResults.indices) {
                if (grantResults[i] == -1) {
                    hasPermissionDismiss = true
                    break
                }
            }
        }
        if (hasPermissionDismiss) { //如果有沒有被允許的權(quán)限
            showPermissionDialog()
            mPermissionDialog.show()
        } else {
            //權(quán)限已經(jīng)都通過了,可以將程序繼續(xù)打開了
           jumpTo(MainActivity::class.java)
        }
    }

    private fun showPermissionDialog() {
        mPermissionDialog = AlertDialog.Builder(this)
            .setMessage("已禁用權(quán)限,請手動(dòng)授予")
            .setPositiveButton(
                "設(shè)置"
            ) { _, _ ->
                mPermissionDialog.dismiss()
                val packageURI =
                    Uri.parse("package:${AppUtils.getAppPackageName()}")
                val intent = Intent(
                    Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                    packageURI
                )
                startActivity(intent)
            }
            .setNegativeButton(
                "取消"
            ) { dialog, which -> //關(guān)閉頁面或者做其他操作
                AppUtils.exitApp()
            }
            .create()
    }

2.文件處理
之后就能對通過文件選擇器獲取文件path了,獲取到path后,先檢查文件是否存在:

 fun readFileToByteArray(size: Int, path: String): ByteArray? {
        var file = readFiles(path);
        if (!file.exists()) {
            Log.e(TAG, "讀取失敗:" + path + "不存在")
            return null;
        }
        return readFileToByteArray(size, file)
    }

將file轉(zhuǎn)換成ByteArray:

fun readFileToByteArray(size: Int, file: File): ByteArray? {
        var inputStream = FileInputStream(file);
        try {
            inputStream = FileInputStream(file);
            var inSize = inputStream.channel.size().toInt();//判斷FileInputStream中是否有內(nèi)容
            if (inSize == 0) {
                Log.d(TAG, "The FileInputStream has no content!");
                return null;
            }

            var buffer = ByteArray(inputStream.available());//in.available() 表示要讀取的文件中的數(shù)據(jù)長度
            inputStream.read(buffer);  //將文件中的數(shù)據(jù)讀到buffer中

            prepareArray(size, buffer)
            return buffer;
        } catch (e: FileNotFoundException) {
            e.printStackTrace();
            return null;
        } catch (e: IOException) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                inputStream.close();
            } catch (e: IOException) {
                return null;
            }
            //或IoUtils.closeQuietly(in);
        }
    }

根據(jù)大小拆分或者使用

  fun prepareArray(size: Int, bytes: ByteArray) {
        if (bytes!!.size > size) {
            // 長度超過size,拆分
            var bytes1 = splitBytes(bytes, size)
            for (i in bytes1.indices) {
                // 超過size,分批輸出流
            }
        } else {
            // 沒有超過size,直接輸出流
        }
    }

其中拆分方法為:

 fun splitBytes(bytes: ByteArray, size: Int): MutableList<ByteArray> {
            var splitLength = size.toDouble();
            var arrayLength = ceil(bytes.size / splitLength).toInt();
            var result: MutableList<ByteArray> = ArrayList();
            var from = 0
            var to = 0
            for (i in 0 until arrayLength) {
                from = (i * splitLength).toInt();
                to = (from + splitLength).toInt();
                if (to > bytes.size)
                    to = bytes.size;
                result.add(bytes.copyOfRange(from, to))
            }
            return result;
        }

合并方法為

    fun byteMergerAll( values: MutableList<ByteArray>): ByteArray? {
            var length_byte = 0
            for (i in values.indices) {
                length_byte += values[i].size
            }
            val all_byte = ByteArray(length_byte)
            var countLength = 0
            for (i in values.indices) {
                val b = values[i]
                System.arraycopy(b, 0, all_byte, countLength, b.size)
                countLength += b.size
            }
            return all_byte
        }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ——個(gè)人平時(shí)筆記,看到的同學(xué)歡迎指正錯(cuò)誤,文中多處摘錄于各大博主與書籍精華 一、優(yōu)化1.布局優(yōu)化:布局優(yōu)化的思路是...
    木溪bo閱讀 272評論 0 1
  • 近期一個(gè)項(xiàng)目需要用到低功耗藍(lán)牙的開發(fā),由于之前沒有藍(lán)牙開發(fā)的經(jīng)驗(yàn),發(fā)現(xiàn)網(wǎng)上關(guān)于藍(lán)牙開發(fā)的資料不多,不是隨便描述一下...
    elecdog閱讀 2,038評論 0 6
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,311評論 2 89
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,719評論 9 468
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,846評論 28 54

友情鏈接更多精彩內(nèi)容