usb tethering programmatically, Failed !!
USB 테더링을 한번에 하기 위해서 app 을 하나 만들려고 이곳저곳 뒤지면서 하나 만들었다. 하지만 결론적으로 ICS 이후 버전에서는 아직까지 동작하는 방법을 찾지 못했다.
- Tested phone : Nexus S rooted device
- Android Version : Jelly bean
Uses-Permissions
ref.1 에서 ICS 이후 부터는WRITE_SECURE_SETTINGS
permission 이 필요하다고 한다. 그리고 rooting 된 폰에서만 가능하다고 한다. 그런데 실제 테스트에서는 아래 3개의 permission 이 필요했다.<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
getTetherableIfaces()
아래 코드로 테스트를 해봤다. 그런데 일단 wlan0 만 보여진다. usb0 가 getTetherableIfaces() 에서 얻어지지 않는다. 이유는 잘 모르겠다. 다만 ref.3 에서도 역시나 안된다고 하는데 "rndis0" 라는 말을 해서 "usb0" 가 아니라 "rndis0" 로 invoke 를 해보았지만 역시나 실패이다.code = (Integer) method.invoke(cm, "usb0");여하튼 아직까지, 된다고 하는 곳은 보지 못했다.
package com.shortcut.tether; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.net.ConnectivityManager; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.Menu; import android.widget.Toast; //public class MainActivity extends PreferenceActivity { public class MainActivity extends Activity { //private static final String USB_TETHER_SETTINGS = "usb_tether_settings"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); switchOnTethering(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } private void switchOnTethering(){ String TAG = "namh"; ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); Log.d(TAG,"test enable usb tethering"); String[] available = null; int code=-1; /** * {@ref: http://alvinalexander.com/java/jwarehouse/android/services/java/com/android/server/ConnectivityService.java.shtml} * {@ref: http://stackoverflow.com/questions/7509924/detect-usb-tethering-on-android} * {@ref: http://stackoverflow.com/questions/9913645/android-enable-usb-tethering-programmatically-there-is-an-app-that-did-it-fo} * * */ Method[] wmMethods = cm.getClass().getDeclaredMethods(); for(Method method: wmMethods){ if(method.getName().equals("getTetherableIfaces")){ try { Log.d(TAG,"before getTetherableIfaces()"); available = (String[]) method.invoke(cm); break; } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } }// end of 'if' }// end of 'for' for(Method method: wmMethods){ if(method.getName().equals("tether")){ try { for(String s : available){ Log.d(TAG, "available = " + s); } Toast.makeText(getApplicationContext(), available[0], Toast.LENGTH_LONG).show(); // available[0] might be String 'usb0' // code = (Integer) method.invoke(cm, available[0]); code = (Integer) method.invoke(cm, "usb0"); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); return; } break; }// end of 'if' } if (code==0) Log.d(TAG,"Enable usb tethering successfully!"); else Log.d(TAG,"Enable usb tethering failed!"); } }
댓글 없음:
댓글 쓰기