从应用程序首选项中读取信息,而不是从AndroidManifest.xml中读取

时间:2013-01-18 10:37:55

标签: android dropbox

我是Android开发人员的新手,我正在使用Eclipse开发Android应用程序。我提供了在Dropbox上同步数据库的功能。为此,Dropbox为我提供了用于身份验证的关键值。此密钥必须插入AndroidManifest.xml

<activity
android:name="com.dropbox.client2.android.AuthActivity"
android:configChanges="orientation|keyboard"
android:launchMode="singleTask" >
<intent-filter>
    <!-- Change this to be db- followed by your app key -->
    <data android:scheme="db-xxxxxxxxxx" />

    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

但是使用这种逻辑,最终用户将无法更改此值以同步他的保管箱帐户上的数据库,而不是我的。我已经设置了一个首选项屏幕来存储应用程序首选项中的键,但我找不到从Android Manifest中读取值的代码。我认为这是关于这里,但我是新的,我不明白如何编辑我的代码:

 public void startAuthentication(Context context) {
    AppKeyPair appKeyPair = getAppKeyPair();

    // Check if the app has set up its manifest properly.
    Intent testIntent = new Intent(Intent.ACTION_VIEW);
    String scheme = "db-" + appKeyPair.key;
    String uri = scheme + "://" + AuthActivity.AUTH_VERSION + "/test";
    testIntent.setData(Uri.parse(uri));
    PackageManager pm = context.getPackageManager();
    List<ResolveInfo> activities = pm.queryIntentActivities(testIntent, 0);

    if (0 == activities.size()) {
        throw new IllegalStateException("URI scheme in your app's " +
                "manifest is not set up correctly. You should have a " +
                "com.dropbox.client2.android.AuthActivity with the " +
                "scheme: " + scheme);
    } else if (activities.size() > 1) {
        // Check to make sure there's no other app with this scheme.
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("Security alert");
        builder.setMessage("Another app on your phone may be trying to " +
                "pose as the app you are currently using. The malicious " +
                "app cannot access your account, but linking to Dropbox " +
                "has been disabled as a precaution. Please contact " +
                "support@dropbox.com.");
        builder.setPositiveButton("OK", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.show();
        return;
    } else {
        // Just one activity registered for the URI scheme. Now make sure
        // it's within the same package so when we return from web auth
        // we're going back to this app and not some other app.
        String authPackage = activities.get(0).activityInfo.packageName;
        if (!context.getPackageName().equals(authPackage)) {
            throw new IllegalStateException("There must be an " +
                    "AuthActivity within your app's package registered " +
                    "for your URI scheme (" + scheme + "). However, it " +
                    "appears that an activity in a different package is " +
                    "registered for that scheme instead. If you have " +
                    "multiple apps that all want to use the same access" +
                    "token pair, designate one of them to do " +
                    "authentication and have the other apps launch it " +
                    "and then retrieve the token pair from it.");
        }
    }

    // Start Dropbox auth activity.
    Intent intent = new Intent(context, AuthActivity.class);
    intent.putExtra(AuthActivity.EXTRA_INTERNAL_CONSUMER_KEY,
            appKeyPair.key);
    intent.putExtra(AuthActivity.EXTRA_INTERNAL_CONSUMER_SECRET,
            appKeyPair.secret);
    if (!(context instanceof Activity)) {
        // If starting the intent outside of an Activity, must include
        // this. See startActivity(). Otherwise, we prefer to stay in
        // the same task.
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
    context.startActivity(intent);

你能帮助我吗?

提前谢谢

2 个答案:

答案 0 :(得分:1)

我认为您可能误解了该密钥的用途。它不用于选择与哪个帐户同步文件。

您要更改的密钥是APP API密钥。每个用户都不需要唯一的密钥,除非您的目标是已经拥有自己的API密钥的开发人员。这用于识别您的应用并关闭它,如果它给Dropbox带来麻烦。

您尝试编辑的此密钥的特定实例是在用户使用其个人帐户进行身份验证后控制权返回到您的应用。这需要与调用AppKeyPair appKeys = new AppKeyPair(APP_KEY,APP_SECRET)时用于身份验证的密钥保持同步;

您将无法在运行时修改该intent过滤器中的数据标记。

答案 1 :(得分:0)

对象appKeyPair.key包含您想要的密钥。 我知道AppKeyPair appKeyPair = getAppKeyPair();做了什么,但我认为你可以删除它并从共享首选项中放入一个简单的字符串,而不是调用appKeyPair.key