android取得藍芽裝置連線狀態

Java

public static boolean isConnected(BluetoothDevice device) {
    try {
        Method m = device.getClass().getMethod("isConnected", (Class[]) null);
        boolean connected = (boolean) m.invoke(device, (Object[]) null);
        return connected;
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}

Kotlin

fun isConnected(device: BluetoothDevice): Boolean {
  return try {
    val m: Method = device.javaClass.getMethod("isConnected")
    m.invoke(device) as Boolean
  } catch (e: Exception) {
    throw IllegalStateException(e)
  }
}

android 10 藍牙程式必須取得ACCESS_FINE_LOCATION權限

寫android 藍牙程式, 若需要scan 功能, 在android 10以前, 只要取得ACCESS_COARSE_LOCATION權限即可, 到了android 10則必須取得ACCESS_FINE_LOCATION權限

詳細的寫法就不多著墨了

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

工作關係需要雙開wechat

  1. 安卓使用雙開助手(請注意, 這會被警告是有害軟體, 請斟酌使用)
    https://www.multiopen.cn/
  2. windows 10上面雙開
    新增一個wechat_multi.bat檔案
    輸入(wechat目錄請依照實際例子使用)
start C:\"Program Files (x86)"\Tencent\WeChat\WeChat.exe 
start C:\"Program Files (x86)"\Tencent\WeChat\WeChat.exe

儲存後, 執行wechat.bat 即可雙開


v2ray初體驗-使用v2-ui初階安裝

安裝v2ray之前,你必須符合以下基本技術基礎

  1. 會安裝CEntOS 7
  2. 懂apache httpd 2.4基本設定
  3. 懂dns, 懂申請let’s Encrypt

你也必須準備以下軟硬體

  1. 安裝好CEntOS7
  2. 有Internet IP
  3. 有網域,並可賦予該系統一個網路名稱

開始安裝

1. 安裝v2ray
到這個神人網站 https://github.com/sprov065/v2-ui/
一鍵安裝
bash <(curl -Ls https://blog.sprov.xyz/v2-ui.sh)

2. 安裝完畢網站預設是 http://ip:65432 預設帳號密碼都是admin , 記得登入修改密碼


3. 以下示範兩種連線, 一種http/2(h2), 另一種透過apache httpd(port 443)代理連到後端websocket
3.1 設定 h2 連線
Server:


client:
v2ray初體驗-使用v2-ui初階安裝



3.2
Server 設定:


Clinet 設定:
websocket , port 用443, 要輸入tls

apache httpd 設定:

ServerName xxx
ErrorLog /var/log/httpd/ssl_error_log1
TransferLog /var/log/httpd/ssl_access_log1

SSLEngine On
SSLProxyEngine On
SSLCertificateFile /etc/letsencrypt/live/xxx/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/xxx/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/xxx/fullchain.pem
## v2-ui management
RewriteEngine On
ProxyPass / http://localhost:65432/
ProxyPassReverse / http://localhost:65432/
## server
RewriteRule /ray/(.*) ws://localhost:1234/$1 [P,L]
RewriteCond %{HTTP:Upgrade} =websocket [NC]
ProxyPass /ray/ http://localhost:1234/
ProxyPassReverse /ray/ http://localhost:1234/


4. 心得
若是使用3.1 , 使用httpd/2的方式
若是使用3.2可以看起來像是https的存取

5. 額外指令

 v2-ui              - 显示管理菜单 (功能更多)
 v2-ui start        - 启动 v2-ui 面板
 v2-ui stop         - 停止 v2-ui 面板
 v2-ui restart      - 重启 v2-ui 面板
 v2-ui status       - 查看 v2-ui 状态
 v2-ui enable       - 设置 v2-ui 开机自启
 v2-ui disable      - 取消 v2-ui 开机自启
 v2-ui log          - 查看 v2-ui 日志
 v2-ui update       - 更新 v2-ui 面板
 v2-ui install      - 安装 v2-ui 面板
 v2-ui uninstall    - 卸载 v2-ui 面板

Android 畫面內容更新注意事項

通常畫面更新前, 需要背景處理的工作, 有時候會耗掉一些時間, 若使用

runOnUIThread 會造成畫面停頓,好像當掉一樣, 此時可以使用AsyncTask處理

class MyAsyncTask extends AsyncTask<Void, Void, Void>{
   
    @Override
    protected Void doInBackground(Void... params) {
    // 這裡處理背景工作
      return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
// 這裡處理畫面元件(這邊會耗時,所以盡量只處理簡單的畫面資料
    }
}

android 上架把log停掉

-dontskipnonpubliclibraryclasses
-dontobfuscate
-forceprocessing
-optimizationpasses 5
-keep class * extends android.app.Activity
-assumenosideeffects class android.util.Log {
public static *** d(…);
public static *** v(…);
}

編輯proguard-rules.pro

buildTypes {
release {
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt’), ‘proguard-rules.pro’
}
}

確認 build.gradle 裡面的 buildTypes 屬性

Android 開檔案出現權限問題 FileUriExposedException

除了設定以下policy外,

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

還需要進行額外設定

try{
Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
m.invoke(null);
}catch(Exception e){
e.printStackTrace();
}

1 2 3 4 5 6