2012-01-05 8 views
6

私は通常、このユーザーが確認せずにDiscoverable時間をプログラムで設定する方法はありますか?

private void ensureDiscoverable() { 
    if(D) Log.d(TAG, "ensure discoverable"); 
    if (mBluetoothAdapter.getScanMode() != 
      BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { 
     Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
     discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); 
     startActivity(discoverableIntent); 
    } 
} 

を使用しかし、それはユーザーの確認を求められます。これをプログラムで回避する方法はありますか?

また、「常に発見可能なmode」に「ニュース」がないとしますか?

答えて

5

私はいくつかの調査の後で、ユーザーのやりとりなしに発見可能なタイムアウトを設定することは、(以前の回答で既に提案されているように)ルートアクセスでのみ可能であると結論付けました。

private void ensureBluetoothDiscoverability() { 
    try { 
     IBluetooth mBtService = getIBluetooth(); 
     Log.d("TESTE", "Ensuring bluetoot is discoverable"); 
     if(mBtService.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { 
      Log.e("TESTE", "Device was not in discoverable mode"); 
      try { 
       mBtService.setDiscoverableTimeout(100); 
       // mBtService.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, 1000); 
      } catch(Exception e) { 
       Log.e("TESTE", "Error setting bt discoverable",e); 
      } 
      Log.i("TESTE", "Device must be discoverable"); 
     } else { 
      Log.e("TESTE", "Device already discoverable"); 
     } 
    } catch(Exception e) { 
     Log.e("TESTE", "Error ensuring BT discoverability", e); 
    }  
} 


<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> 

そして、新しいパッケージを作成android.bluetooth IBluetooth.aidlとIBluetoothCallback.aidl内の2つのファイルを配置し、置く:しかし、誰かのためにここに必要なソリューションであることを必要とする人図のようにコード内にhere

標準APIでは利用できない関数にアクセスすることができますが、その中には "安全な設定を書き込む"権限が必要なものがあります(上のコメント行は、プロセス/ユーザの)。

+0

こんにちは、私はこのコードを試してみました。しかし、私は成功を収めていません。私はLG 2.3.4でテストしました。私が間違っているところを教えてくれますか? –

+0

どこでIBluetoothクラス@Tiagoを取得しますか? @AnasAzeem? – gumuruh

1

何もない - ユーザーの確認が必要です。

バッテリーを使い切ると、簡単に解決できません。 プライバシーに関する問題です。 ユーザーに尋ねる方が良いです。

+0

私は回避策があると信じて、私があれば、それをチェックします有用なものが分かれることが分かりました;) – Tiago

+0

私は結局、このhttp://www.devdaily.com/java/jwarehouse/android/core/java/android/bluetooth/BluetoothAdapter.java.shtmlを発見しました。残念ながら、setDiscoverableTimoutはt仕事:( – Tiago

+1

これはプライバシーやバッテリーの問題ではありません。あなたは常に何かを尋ねない何度も何度も発見を誘発します。 –

3

私がやったことだし、それは私のために正常に動作します:

方法:

public void makeDiscoverable (int timeOut){ 
    Class <?> baClass = BluetoothAdapter.class; 
    Method [] methods = baClass.getDeclaredMethods(); 
    Method mSetScanMode = methods[44]; 
    try { 
     mSetScanMode.invoke(Util.mBluetoothAdapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeOut); 
    } catch (Exception e) { 
     Log.e("discoverable", e.getMessage()); 
    }  
} 

は許可を追加します。

<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
+0

stidiovip

+1

setScanModeはメソッド番号44ではありません – nonsensei

関連する問題