Android使用sharedUserId将免费应用升级到付费应用

时间:2010-06-01 16:12:26

标签: android android-manifest

我目前在市场上有付费应用。现在我想提供一个免费的应用程序供用户先试用。我还希望能够确保免费应用程序的用户在升级到付费应用程序后可以看到这些数据。

通过Android文档后,似乎在Manifest中使用sharedUserId会起作用。

我发现的问题是,如果我将sharedUserId放在版本2的付费应用的清单中,则其旧版本(版本1)将无法工作,因为使用sharedUserId的新应用程序不再可见数据。请注意,在版本1中,我没有实现sharedUserId。

所以现在我想知道是否还有其他解决方法可以实现,以便: a)付费应用的旧版本(没有sharedUserId)仍然适用于新版本(使用sharedUserId)。

b)从免费版本到付费版本的升级路径将包括剩余可见的数据。

任何?似乎有人必须遇到类似情况并找到解决方案?

1 个答案:

答案 0 :(得分:-1)

我的解决方案是在免费应用中使用简单的Content Provider公开数据,与完整的应用共享密码以避免安全漏洞。

免费应用:AndroidManifest.xml

<provider android:name="MY_PACKAGE.PrefProvider" android:authorities="MY_PACKAGE.prefprovider" />

免费应用:PrefProvider.java

public class PrefProvider extends ContentProvider {

    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        if (! selection.equals(MY_SECRET)) {
            return null;    //Wrong shared secret
        }
        MatrixCursor prefs = new MatrixCursor(new String[] {"field1", "field2", "field3"});         
        MatrixCursor.RowBuilder rb = prefs.newRow();
        rb.add(settings.getString("field1", ""));
        rb.add(settings.getString("field2", ""));
        rb.add(settings.getString("field3", ""));       
        return prefs;
    }

}

付费应用:主要活动

    if (isFirstTime) {
        //  Is the first time that the full version is being launched
        Cursor cursor = act.getContentResolver().query(Uri.parse("content://MY_PACKAGE.prefprovider"), null, providerKey, null, null);
        if (cursor != null && cursor.moveToFirst() != false) { // non empty cursor, the free app is installed
            field1 = cursor.getString(0);
            field2 = cursor.getString(1);
            field3 = cursor.getString(2);
            cursor.close();
        }
    }