2012-01-05 6 views
6

मैं आमतौर पर इसउपयोगकर्ता पुष्टि के बिना प्रोग्रामेटिक रूप से डिस्कवर योग्य समय कैसे सेट करें?

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 अंदर दो फ़ाइलों जगह है और डाल कोड के अंदर here दिखाया गया है।

यह उन मानकों तक पहुंचने की अनुमति देगा जो मानक API पर उपलब्ध नहीं हैं, लेकिन उनमें से कुछ के लिए आपको "सुरक्षित सेटिंग्स लिखने" की अनुमति की आवश्यकता होगी (ऊपर टिप्पणी पंक्ति है जहां आपको अनुमतियों की कमी के लिए अपवाद मिलेगा प्रक्रिया/उपयोगकर्ता का)।

+0

हाय, मैंने इस कोड के साथ प्रयास किया। लेकिन मुझे सफलता नहीं मिल रही है। मैंने एलजी 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 दुर्भाग्य से सेट डिस्क्लेबल करने योग्य टिमआउट नहीं मिला टी काम :( – 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

<उपयोग-अनुमति एंड्रॉइड: नाम = "android.permission.WRITE_SETTINGS" /> – stidiovip

+1

setScanMode कोई और तरीका संख्या 44 नहीं है – nonsensei

संबंधित मुद्दे