How to use BluetoothHeadset class via reflection

前端 未结 2 1792
渐次进展
渐次进展 2021-01-14 19:55

I want to use methods of BluetoothHeadset class in Android 2.0+. Here is my code:

    Class bluetoothHeadsetClass = Class.forName(\"android.bluetooth.Bluetoo         


        
2条回答
  •  无人及你
    2021-01-14 20:20

    Here is how I did it using reflection. I haven't checked if this code works for a while now, so it might well be not:

    class BluetoothHeadset                      
    {
        private static final String TAG = Tags.getTag(BluetoothHeadset.class);  
        private static final String BLUETOOTH_HEADSET_CLASS_NAME = "android.bluetooth.IBluetoothHeadset";
        private static final String BLUETOOTH_HEADSET_STUB_CLASS_NAME = BLUETOOTH_HEADSET_CLASS_NAME+"$Stub";
    
        public static final String ACTION_BLUETOOTH_HEADSET_SERVICE = BLUETOOTH_HEADSET_CLASS_NAME; 
        public static final String ACTION_STATE_CHANGED = "android.bluetooth.headset.action.STATE_CHANGED";
        public static final String ACTION_AUDIO_STATE_CHANGED = "android.bluetooth.headset.action.AUDIO_STATE_CHANGED";
        public static final String EXTRA_AUDIO_STATE = "android.bluetooth.headset.extra.AUDIO_STATE";
    
         /** A SCO audio channel is not established */
        public static final int AUDIO_STATE_DISCONNECTED = 0;
        /** A SCO audio channel is established */
        public static final int AUDIO_STATE_CONNECTED = 1;
    
        private static final String AS_INTERFACE_METHOD_NAME = "asInterface";
        private static final String IS_CONNECTED_METHOD_NAME = "isConnected";   
    
        final Object m_service; 
        private BluetoothHeadset(Object service)
        {
            m_service = service;
        }
    
        static public BluetoothHeadset getBluetoothHeadset(IBinder service)
        {
            if (service == null) 
            {
                return null;
            }
    
            Object proxy = null;
            try
            {
                Class clazz = Class.forName(BLUETOOTH_HEADSET_STUB_CLASS_NAME);
                Method asInterfaceMethod = clazz.getMethod(AS_INTERFACE_METHOD_NAME, IBinder.class);
                proxy = asInterfaceMethod.invoke(null, service);            
            }
            catch(ClassNotFoundException ex)
            {
                String msg = String.format("Was not able to find %s class.", 
                                            BLUETOOTH_HEADSET_STUB_CLASS_NAME); 
                Log.e(TAG, msg, ex);
            }
            catch(NoSuchMethodException ex)
            {
                String msg = String.format("Was not able to find %s method in %s class.", 
                                            AS_INTERFACE_METHOD_NAME, 
                                            BLUETOOTH_HEADSET_STUB_CLASS_NAME);
                Log.e(TAG, msg, ex);
            }       
            catch(InvocationTargetException ex)
            {
                String msg = String.format("Was not able to invoke %s method in %s class.", 
                                            AS_INTERFACE_METHOD_NAME, 
                                            BLUETOOTH_HEADSET_STUB_CLASS_NAME);
                Log.e(TAG, msg, ex);
            }
            catch(IllegalAccessException ex)
            {
                String msg = String.format("Illegal access while invoking %s method in %s class.", 
                                            AS_INTERFACE_METHOD_NAME, 
                                            BLUETOOTH_HEADSET_STUB_CLASS_NAME);
                Log.e(TAG, msg, ex);
            }
    
            if(proxy == null) return null;      
            return new BluetoothHeadset(proxy);
        }
    
        public Boolean isDeviceConnected(BluetoothDevice device)
        {
            //invoke: boolean isConnected(BluetoothDevice device);
            try
            {
                Class clazz = m_service.getClass();
                Method isConnectedMethod = clazz.getMethod(IS_CONNECTED_METHOD_NAME, BluetoothDevice.class);
                Object result = isConnectedMethod.invoke(m_service, device);
    
                return (Boolean)result;
            }
            catch(NoSuchMethodException ex)
            {
                String msg = String.format("Failed to find %s method in class %s.", 
                                            IS_CONNECTED_METHOD_NAME, m_service.getClass().getName());
                Log.e(TAG, msg, ex);
            }
            catch(InvocationTargetException ex)
            {
                String msg = String.format("Failed to invoke %s method in class %s.", 
                                            IS_CONNECTED_METHOD_NAME, m_service.getClass().getName());
                Log.e(TAG, msg, ex);
            }   
            catch(IllegalAccessException ex)
            {
                String msg = String.format("Illegal access when invoking %s method in class %s.", 
                                            IS_CONNECTED_METHOD_NAME, m_service.getClass().getName());          
                Log.e(TAG, msg, ex);
            }
            catch(Exception ex)
            {
                Log.e(TAG, "Unknown exception was thrown.", ex);
            }
    
            return null;
        }   
    }
    

提交回复
热议问题