本週工作進展
APP “西瓜街景”正式完成。在上一次博客的進度的基礎上,這段時間主要工作是接入網絡、修改界面以及配合其他成員的文本檢測和識別模型進行測試。
詳細工作內容
1. okhttp上傳圖片
val file = File(bitmapPath)
val requestBody = MultipartBody
.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("bitmap", file.name, RequestBody.create(MediaType.parse("image/jpg"), file))
.build()
val request = Request
.Builder()
.url("http://${activity.spServiceIp}/upload_img")
.post(requestBody)
.build()
val boxes = try {
OkHttpClient()
.newBuilder()
.connectTimeout(60L, TimeUnit.SECONDS)
.callTimeout(60L, TimeUnit.SECONDS)
.readTimeout(60L, TimeUnit.SECONDS)
.writeTimeout(60L, TimeUnit.SECONDS)
.build()
.newCall(request)
.execute()
.body()
?.string()
?.let { Json.nonstrict.parseList<TextBox>(it) }
?.onEach { it.text = translate(it.text) }
} catch (e: Exception) {
e.printStackTrace()
activity.runOnUiThread { callback.onFailure(e) }
return@thread
}
2. 設置頁面
Android 中的 Preference 可以快速配置設置界面並直接與 SharedPreferences 交互,免去手動編寫界面的麻煩。通過調用PreferenceManager.getDefaultSharedPreferences(context) 獲取設置的值。
項目中我使用了 PreferenceActivity,不過很多方法已經 Deprecated 了,推薦使用 AppCompatActivity+PreferenceFragment。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="服務器ip">
<EditTextPreference
android:defaultValue="192.168.0.16:5000"
android:key="service_ip"
android:title="ip"/>
</PreferenceCategory>
<PreferenceCategory android:title="街景預覽">
<SwitchPreference
android:defaultValue="true"
android:key="is_background_dark"
android:title="背景變暗"/>
<SwitchPreference
android:defaultValue="false"
android:key="show_text_border"
android:title="顯示文本框"/>
<SwitchPreference
android:defaultValue="true"
android:key="highlight_crowding_text"
android:title="擁擠文本高亮"/>
<SwitchPreference
android:defaultValue="true"
android:key="is_text_tilt"
android:title="文本允許傾斜"/>
</PreferenceCategory>
<PreferenceCategory android:title="內存管理">
<Preference
android:key="data_clear"
android:title="清除數據"/>
</PreferenceCategory>
</PreferenceScreen>
class SettingsActivity : PreferenceActivity() {
private var clear = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
addPreferencesFromResource(R.xml.setting_main)
val prefClear = findPreference("data_clear")
prefClear.setOnPreferenceClickListener {
...
true
}
val prefIp = findPreference("service_ip")
prefIp.title = spServiceIp
prefIp.setOnPreferenceChangeListener { _, newValue ->
prefIp.title = newValue.toString()
true
}
}
/** 插入 toolbar */
override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
val root = findViewById<ListView>(android.R.id.list).parent.parent.parent
val bar = LayoutInflater
.from(this)
.inflate(R.layout.include_app_bar, root as ViewGroup, false)
as AppBarLayout
root.addView(bar, 0)
with(bar.toolbar_app) {
title = "設置"
navigationIcon = resources.getDrawable(R.drawable.ic_arrow_back_black_24dp)
setNavigationOnClickListener { finish() }
}
}
}