如何使用Java Reflecion(Android SDK 14+)添加自己的VPN设置

肯尼·鲍尔斯(KennyPowers)

我知道android.net.VpnService基本上是构建自定义vpn解决方案的基类,但是我想要的只是创建和使用PPTP或L2TP VPN连接(只是内置VPN管理器的新配置文件)。我认为最简单的方法是对com.android.settings.vpn.VpnSettings使用Java反射。这是另一篇文章中的代码片段(如何向系统VPN设置页面添加自己的VPN设置?

package com.nikola.despotoski.whatever;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class VpnSetter {

    private static Map<String , Class<?>> getMappedFields(){
        Map<String , Class<?>> fieldsAndTypes = new HashMap<String, Class<?>>();
        fieldsAndTypes.put("name", String.class);        // 0
        fieldsAndTypes.put("type" , int.class);   // 1
        fieldsAndTypes.put("server", String.class);        // 2
        fieldsAndTypes.put("username", String.class);
        fieldsAndTypes.put("password", String.class);
        fieldsAndTypes.put("dnsServers", String.class);
        fieldsAndTypes.put("searchDomains", String.class);
        fieldsAndTypes.put("routes", String.class);
        fieldsAndTypes.put("mppe", boolean.class);
        fieldsAndTypes.put("l2tpSecret", String.class);
        fieldsAndTypes.put("ipsecIdentifier", String.class);
        fieldsAndTypes.put("ipsecSecret", String.class);
        fieldsAndTypes.put("ipsecUserCert", String.class);
        fieldsAndTypes.put("ipsecCaCert", String.class);
        fieldsAndTypes.put("saveLogin", boolean.class);
        return fieldsAndTypes;
    }
    public static final Set<String> VPN_PROFILE_KEYS = getMappedFields().keySet(); // contains keys for quicker generation of key-value map for each 

    public static void addVpnProfile(String vpnProfileKey, Map<String, Object> values) throws ClassNotFoundException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException{
        Class<?> vpnSettings = Class.forName("com.android.settings.vpn2.VpnSettings");
        Class<?>[] privateVpnSettingsClasses = vpnSettings.getDeclaredClasses();
        Class<?> vpnPreference = null;
        Class<?> vpnProfileClass = Class.forName("com.android.settings.vpn2.VpnProfile");
        for(Class<?> priv :privateVpnSettingsClasses ){
            if(priv.getName().equals("VpnPreference")){
                vpnPreference = priv;
                break;
            }
        }
        Field vpnProfileFromVpnPreferenceField = vpnPreference.getDeclaredField("mProfile");
        vpnProfileFromVpnPreferenceField.setAccessible(true);
        Object vpnProfile = vpnProfileFromVpnPreferenceField.get(vpnProfileClass);
        Constructor<?> constructor = vpnProfileFromVpnPreferenceField.getClass().getConstructors()[0];
        constructor.setAccessible(true);
        vpnProfile = constructor.newInstance(vpnProfileKey);//creating new instance of VpnProfile class
        Map<String, Class<?>> vpnProfileMap = getMappedFields();
        Iterator<String> profileKeysIterator = vpnProfileMap.keySet().iterator();
        while(profileKeysIterator.hasNext()){
            String key = profileKeysIterator.next();
            Field field = vpnProfile.getClass().getField(key);
            field.setAccessible(true);
            if(vpnProfileMap.get(key).equals(String.class) && values.get(key)!=null){
                String s = new String();
                field.set(s, "value");//change this
            }else if(vpnProfileMap.get(key).equals(boolean.class) && values.get(key)!=null){
                int i = 0;
                field.setInt(i, 1111111);// change this
            }else if(values.get(key)!=null){
                boolean  b = false;
                field.setBoolean(b, true);// change this
            }

        }
        vpnSettings = Class.forName("com.android.settings.vpn.VpnSettings"); //time to add it to settings
        Method addProfileMethod = vpnSettings.getDeclaredMethod("addProfile", vpnProfile.getClass()); 
        addProfileMethod.setAccessible(true);
        addProfileMethod.invoke(vpnSettings, vpnProfile);
    }
}

当我运行此代码时,我得到: java.lang.classnotfoundexception: com.android.settings.vpn2.vpnsettings

只是知道我在做什么错。我尝试使用API​​ 14,15 .. 18设备未植根。

如果您还有其他关于如何向内置VPN管理器中添加新配置文件的建议,请告诉我。

j__m

基本上,您正在尝试的操作无法正常工作,因为VpnSettings该类在您的应用程序中不可用。它不是Android框架的私有部分;它是“设置”应用的一部分,该应用与您的应用完全不同。这就像尝试org.mozilla.firefox.App从Firefox应用访问该类。你做不到 如果可以的话,您会发现它仍然不起作用,因为VpnSettings将其设置保存到您的应用无权访问的位置。

如果您的设备植根,并且您的应用具有root访问权限,则您可能会自己写该位置。否则,您将没有机会。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用IntelliJ正确设置Android的Java SDK

来自分类Dev

如何将自己的VPN设置添加到系统VPN设置页面?

来自分类Dev

如何设置自己的VPN代理?

来自分类Dev

Android SDK如何使用OnClickListener

来自分类Dev

将您的SDK添加为模块后,如何修复Android导入设置?

来自分类Dev

如何区分Android SDK方法和我自己的方法

来自分类Dev

如何使用Google Admin SDK Java API添加用户别名

来自分类Dev

为什么未在使用情况统计信息和Android SDK Manager中显示Android API 11,12,13,14?

来自分类Dev

如何在Android Studio中设置早期的Android SDK版本

来自分类Dev

在Java上使用Java AWS SDK与Android

来自分类Dev

14之前,QuickBlox Android SDK 1.2不再在Android API上运行

来自分类Dev

如何在Worklight Studio中设置Android SDK目标

来自分类Dev

如何为Android Studio设置Sceneform SDK 1.16

来自分类Dev

如何在Worklight Studio中设置Android SDK目标

来自分类Dev

如何使用metaio SDK添加我们自己的POI

来自分类Dev

如何使用metaio SDK添加我们自己的POI

来自分类Dev

Skobbler Android SDK:如何添加更多语言文件

来自分类Dev

Android SDK-使用相同的Intent设置多个警报

来自分类Dev

Android:单击按钮后的布局动画为最低SDK版本14

来自分类Dev

在Android应用中使用Java SDK

来自分类Dev

如何使用Android SDK为Amazon push SNS设置应用程序ARN

来自分类Dev

如何使用Android的Fabric Sdk从Twitter注销

来自分类Dev

使用Android Beamless API级别14

来自分类Dev

使用Android Beamless API级别14

来自分类Dev

我应该如何设置IntelliJ 14的内存?

来自分类Dev

如何使用ArcGIS android SDK将标记或图形添加到MapView?

来自分类Dev

Android SDK无法使用ADB

来自分类Dev

指定flutter使用的Android SDK

来自分类Dev

Android SDK无法使用ADB

Related 相关文章

  1. 1

    如何使用IntelliJ正确设置Android的Java SDK

  2. 2

    如何将自己的VPN设置添加到系统VPN设置页面?

  3. 3

    如何设置自己的VPN代理?

  4. 4

    Android SDK如何使用OnClickListener

  5. 5

    将您的SDK添加为模块后,如何修复Android导入设置?

  6. 6

    如何区分Android SDK方法和我自己的方法

  7. 7

    如何使用Google Admin SDK Java API添加用户别名

  8. 8

    为什么未在使用情况统计信息和Android SDK Manager中显示Android API 11,12,13,14?

  9. 9

    如何在Android Studio中设置早期的Android SDK版本

  10. 10

    在Java上使用Java AWS SDK与Android

  11. 11

    14之前,QuickBlox Android SDK 1.2不再在Android API上运行

  12. 12

    如何在Worklight Studio中设置Android SDK目标

  13. 13

    如何为Android Studio设置Sceneform SDK 1.16

  14. 14

    如何在Worklight Studio中设置Android SDK目标

  15. 15

    如何使用metaio SDK添加我们自己的POI

  16. 16

    如何使用metaio SDK添加我们自己的POI

  17. 17

    Skobbler Android SDK:如何添加更多语言文件

  18. 18

    Android SDK-使用相同的Intent设置多个警报

  19. 19

    Android:单击按钮后的布局动画为最低SDK版本14

  20. 20

    在Android应用中使用Java SDK

  21. 21

    如何使用Android SDK为Amazon push SNS设置应用程序ARN

  22. 22

    如何使用Android的Fabric Sdk从Twitter注销

  23. 23

    使用Android Beamless API级别14

  24. 24

    使用Android Beamless API级别14

  25. 25

    我应该如何设置IntelliJ 14的内存?

  26. 26

    如何使用ArcGIS android SDK将标记或图形添加到MapView?

  27. 27

    Android SDK无法使用ADB

  28. 28

    指定flutter使用的Android SDK

  29. 29

    Android SDK无法使用ADB

热门标签

归档