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