我有一个应用程序,我想在市场上作为一个付费应用程序。我想有其他版本,这将是一个“试用”版本的时间限制,比如说,5天?
我该怎么做呢?
发布于 2009-06-15 14:02:04
目前,大多数开发人员使用以下3种技术之一来实现这一点。
第一种方法很容易绕过,第一次运行应用程序时,将日期/时间保存到文件、数据库或共享首选项中,之后每次运行应用程序时,都会检查试用期是否结束。这很容易规避,因为卸载和重新安装将允许用户有另一个试用期。
第二种方法更难绕过,但仍然可以绕过。使用硬编码的定时炸弹。基本上,使用这种方法,您将硬编码一个试用的结束日期,并且所有下载和使用该应用程序的用户将同时停止使用该应用程序。我之所以使用这种方法,是因为它很容易实现,而且在很大程度上,我不想经历第三种技术的麻烦。用户可以通过手动更改手机上的日期来规避这一点,但大多数用户不会不厌其烦地这样做。
第三种技术是我听说的唯一能够真正完成你想做的事情的方法。您必须设置一个服务器,然后每当您的应用程序启动时,您的应用程序都会将phones unique identifier发送到服务器。如果服务器没有该电话id的条目,那么它会创建一个新的条目并记下时间。如果服务器确实有电话id的条目,那么它会执行一个简单的检查,以查看试用期是否已到期。然后,它将试用过期检查的结果传送回您的应用程序。这种方法不应该被绕过,但确实需要设置and服务器等。
在onCreate中执行这些检查始终是一种良好的做法。如果过期已结束,则会弹出一个AlertDialog,其中包含该应用程序完整版的market link。只包含一个"OK“按钮,一旦用户单击了"OK”,就调用"finish()“来结束活动。
发布于 2013-09-05 21:21:05
现在,在最新版本的android免费试用订阅已经添加,您可以解锁您的应用程序的所有功能,只有在app内购买订阅免费试用期。这将允许用户在试用期内使用您的应用程序,如果应用程序在试用期后仍未安装,则订阅费将转移到您身上。我没有尝试过,只是分享了一个想法。
发布于 2014-02-19 00:59:29
我在搜索同样的问题时遇到了这个问题,我认为我们可以利用免费的date api,如http://www.timeapi.org/utc/now或其他一些date api来检查试用应用程序的过期。如果您希望交付演示,并且担心付款和需要修复保留期演示,则此方法是有效的。:)
找到下面的代码
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
}
}
它的工作解决方案……
https://stackoverflow.com/questions/995719
复制相似问题