Android 使用phonegap获取唯一的设备id

Android 使用phonegap获取唯一的设备id,android,iphone,mobile,cordova,udid,Android,Iphone,Mobile,Cordova,Udid,我正在为ios和android开发一个使用phonegap的应用程序。 我的应用程序将有5个项目的免费试用,每增加一个项目,用户将不得不支付 我的问题是,我无法使用我的应用程序获取设备的任何唯一标识符,因此用户可以使用5个免费项目,然后卸载并重新安装应用程序,并获取传统的5个免费项目 我曾尝试使用phonegap api提供的device.udid,但每次重新安装时它都会发生变化 有什么想法吗?就我个人而言,我发现唯一的Android ID最好的方法就是生成一个16-26个字母数字字符的随机字符

我正在为ios和android开发一个使用phonegap的应用程序。 我的应用程序将有5个项目的免费试用,每增加一个项目,用户将不得不支付

我的问题是,我无法使用我的应用程序获取设备的任何唯一标识符,因此用户可以使用5个免费项目,然后卸载并重新安装应用程序,并获取传统的5个免费项目

我曾尝试使用phonegap api提供的device.udid,但每次重新安装时它都会发生变化


有什么想法吗?

就我个人而言,我发现唯一的Android ID最好的方法就是生成一个16-26个字母数字字符的随机字符串,检查它在您的服务器上不存在,然后将其保存在本地首选项中


我尝试过其他方法来获得唯一的ID(例如TelephonyManager),但我知道的所有方法都有可能返回null(这一点都不好)。如果其他人有更好的方法不能潜在地返回null,我很乐意听到它。

使用设备IMEI,如下所示--

活动文件:

public class Welcome extends Activity {

    private TextView display;
    private Button checkAgain;
    private TelephonyManager telephonyManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        display = (TextView) findViewById(R.id.display);
        checkAgain = (Button) findViewById(R.id.buttonCheckAgain);

        display.setText("");

        telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        updateDisplay();

        checkAgain.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                updateDisplay();
            }
        });

    }

    private void updateDisplay() {
        display.setText(getDeviceID(telephonyManager));
        System.out.println("Display upadated");
    }

    private String getDeviceID(TelephonyManager phonyManager) {

        String id = phonyManager.getDeviceId();
        if (id == null) {
            id = "not available";
        }

        int phoneType = phonyManager.getPhoneType();
        switch (phoneType) {
        case TelephonyManager.PHONE_TYPE_NONE:
            return "NONE: " + id;

        case TelephonyManager.PHONE_TYPE_GSM:
            return "GSM: IMEI=" + id;

        case TelephonyManager.PHONE_TYPE_CDMA:
            return "CDMA: MEID/ESN=" + id;

        default:
            return "UNKNOWN: ID=" + id;
        }
    }
}
您需要此权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

获取设备的MAC地址并对其进行SHA1哈希以混淆。Android和iOS设备上都有开源代码

无论您将来是否继续使用PhoneGap或编写本机代码,这种类型的解决方案都是有效的。此外,就应用程序审查流程而言,苹果没有任何问题


更新:这是iOS 6之前和之后的正确答案,但是对于iOS SDK大于6的所有版本,这不再可能。任何尝试使用以前有效的低级呼叫的行为都会返回2的MAC地址。广告ID和AdSupport.framework是唯一的方法。如果你有一部越狱手机,并且可以获得root权限,那么它可能仍然有效。不确定。

仅适用于Android,但您也可以对iPhone使用相同的方法。TelephonyManager有可能返回空ID,如我在下面的回答中所述,这是不允许的。是的。。但我从未测试过这个。那么100中有什么可能被空??请回复。这完全取决于设备。另外,请记住,TelehonyManager在平板电脑上会返回null。在工厂重置时,其他几种方法也会返回不同的设备ID。你可以在这个页面上找到更多的信息,但是这些评论实际上包含了更好的问题答案:是的。。这是您提供的一个重要主题和链接。谢谢你。我真的不知道真正的解决办法是什么。我不使用PhoneGap,我们编写本机iOS和Java,但我的理解是PhoneGap允许您编写本机代码并将其注入PhoneGap。因此,您可以在internet上编写/找到一些简单的低级方法,这些方法可以获取MAC地址并对其执行您想要的操作,然后将其传递给您的PhoneGap代码。Hello@CliffRibaudo您是否可以发布获取MAC地址代码的可靠链接。有人认为我想问一件事:;我们知道的是手机的身份号,如果是的话,那么为什么在我的ans这样的代码中有可能返回null呢?我们从这个开始,通过对它执行SHA256对它进行清理和模糊处理。从这里开始:我不知道去哪里找。试试谷歌。有没有可能从你那里得到一个“公认的答案”。如果你觉得这里的人的评论很有帮助,这是一种习惯仅供参考。。。。从iOS 7开始,在iOS设备上获取MAC地址实际上是不可能的。SDK对其进行模糊处理并返回2。是的,“2”。所以您必须使用广告ID。