首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >创建一个固定时间后过期的Android试用应用

创建一个固定时间后过期的Android试用应用
EN

Stack Overflow用户
提问于 2009-06-15 11:57:53
回答 3查看 66.9K关注 0票数 106

我有一个应用程序,我想在市场上作为一个付费应用程序。我想有其他版本,这将是一个“试用”版本的时间限制,比如说,5天?

我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-15 14:02:04

目前,大多数开发人员使用以下3种技术之一来实现这一点。

第一种方法很容易绕过,第一次运行应用程序时,将日期/时间保存到文件、数据库或共享首选项中,之后每次运行应用程序时,都会检查试用期是否结束。这很容易规避,因为卸载和重新安装将允许用户有另一个试用期。

第二种方法更难绕过,但仍然可以绕过。使用硬编码的定时炸弹。基本上,使用这种方法,您将硬编码一个试用的结束日期,并且所有下载和使用该应用程序的用户将同时停止使用该应用程序。我之所以使用这种方法,是因为它很容易实现,而且在很大程度上,我不想经历第三种技术的麻烦。用户可以通过手动更改手机上的日期来规避这一点,但大多数用户不会不厌其烦地这样做。

第三种技术是我听说的唯一能够真正完成你想做的事情的方法。您必须设置一个服务器,然后每当您的应用程序启动时,您的应用程序都会将phones unique identifier发送到服务器。如果服务器没有该电话id的条目,那么它会创建一个新的条目并记下时间。如果服务器确实有电话id的条目,那么它会执行一个简单的检查,以查看试用期是否已到期。然后,它将试用过期检查的结果传送回您的应用程序。这种方法不应该被绕过,但确实需要设置and服务器等。

在onCreate中执行这些检查始终是一种良好的做法。如果过期已结束,则会弹出一个AlertDialog,其中包含该应用程序完整版的market link。只包含一个"OK“按钮,一旦用户单击了"OK”,就调用"finish()“来结束活动。

票数 188
EN

Stack Overflow用户

发布于 2013-09-05 21:21:05

现在,在最新版本的android免费试用订阅已经添加,您可以解锁您的应用程序的所有功能,只有在app内购买订阅免费试用期。这将允许用户在试用期内使用您的应用程序,如果应用程序在试用期后仍未安装,则订阅费将转移到您身上。我没有尝试过,只是分享了一个想法。

Here's documentation

票数 3
EN

Stack Overflow用户

发布于 2014-02-19 00:59:29

我在搜索同样的问题时遇到了这个问题,我认为我们可以利用免费的date api,如http://www.timeapi.org/utc/now或其他一些date api来检查试用应用程序的过期。如果您希望交付演示,并且担心付款和需要修复保留期演示,则此方法是有效的。:)

找到下面的代码

代码语言:javascript
复制
public class ValidationActivity extends BaseMainActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
protected void onResume() {
    processCurrentTime();
    super.onResume();
}

private void processCurrentTime() {
    if (!isDataConnectionAvailable(ValidationActivity.this)) {
        showerrorDialog("No Network coverage!");
    } else {
        String urlString = "http://api.timezonedb.com/?zone=Europe/London&key=OY8PYBIG2IM9";
        new CallAPI().execute(urlString);
    }
}

private void showerrorDialog(String data) {
    Dialog d = new Dialog(ValidationActivity.this);
    d.setTitle("LS14");
    TextView tv = new TextView(ValidationActivity.this);
    tv.setText(data);
    tv.setPadding(20, 30, 20, 50);
    d.setContentView(tv);
    d.setOnDismissListener(new OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {
            finish();
        }
    });
    d.show();
}

private void checkExpiry(int isError, long timestampinMillies) {
    long base_date = 1392878740000l;// feb_19 13:8 in GMT;
    // long expiryInMillies=1000*60*60*24*5;
    long expiryInMillies = 1000 * 60 * 10;
    if (isError == 1) {
        showerrorDialog("Server error, please try again after few seconds");
    } else {
        System.out.println("fetched time " + timestampinMillies);
        System.out.println("system time -" + (base_date + expiryInMillies));
        if (timestampinMillies > (base_date + expiryInMillies)) {
            showerrorDialog("Demo version expired please contact vendor support");
            System.out.println("expired");
        }
    }
}

private class CallAPI extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        String urlString = params[0]; // URL to call
        String resultToDisplay = "";
        InputStream in = null;
        // HTTP Get
        try {
            URL url = new URL(urlString);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            in = new BufferedInputStream(urlConnection.getInputStream());
            resultToDisplay = convertStreamToString(in);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return e.getMessage();
        }
        return resultToDisplay;
    }

    protected void onPostExecute(String result) {
        int isError = 1;
        long timestamp = 0;
        if (result == null || result.length() == 0 || result.indexOf("<timestamp>") == -1 || result.indexOf("</timestamp>") == -1) {
            System.out.println("Error $$$$$$$$$");
        } else {
            String strTime = result.substring(result.indexOf("<timestamp>") + 11, result.indexOf("</timestamp>"));
            System.out.println(strTime);
            try {
                timestamp = Long.parseLong(strTime) * 1000;
                isError = 0;
            } catch (NumberFormatException ne) {
            }
        }
        checkExpiry(isError, timestamp);
    }

} // end CallAPI

public static boolean isDataConnectionAvailable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = connectivityManager.getActiveNetworkInfo();
    if (info == null)
        return false;

    return connectivityManager.getActiveNetworkInfo().isConnected();
}

public String convertStreamToString(InputStream is) throws IOException {
    if (is != null) {
        Writer writer = new StringWriter();

        char[] buffer = new char[1024];
        try {
            Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            int n;
            while ((n = reader.read(buffer)) != -1) {
                writer.write(buffer, 0, n);
            }
        } finally {
            is.close();
        }
        return writer.toString();
    } else {
        return "";
    }
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

}
}

它的工作解决方案……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/995719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档