[컴][안드로이드] USB 테더링을 소스코드에서 켜기. USB tethering programmatically


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!");
    
    }
}

참고사항

추가적으로 "wlan0"를 test 해 보니, 기존의 settings 창이 바뀌지 않아 조금 번거롭지만, 한번 켰다 꺼야 했다. 다음에 소스를 추가할 때는 settings 도 같이 변경 해 줘야 할 듯 하다.


References

  1. Android - enable USB tethering programmatically - there is an app that did it for 2.3, Stackoverflow
  2. Android apk 만들기
  3. S3 Running ICS No Longer supports programatic enabling of USB Tethering

댓글 없음:

댓글 쓰기