Read informations from application preferences instead from AndroidManifest.xml

为君一笑 提交于 2019-12-11 09:08:13

问题


I'm new in Android dev and I'm developing an Android App using Eclipse. I provided a functionality to Synchronize database on Dropbox. To do it, Dropbox give me a key value to use for authentication. This key have to be inserted in 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>

But using this logic, the end user will not be able to change this value to synchronize database on his dropbox account, and not on my. I've made a preference screen to store the key in Application Preferences, but I' don't find code where the value is read from Android Manifest. I think it's about here but I'm new and I don't understand how to edit my code:

 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);

Can you help me?

Thank you in advance


回答1:


I think that you may be misunderstanding what that key is used for. It is not used for choosing which account to sync files with.

The key you want to change is an APP API key. Each user does not need a unique key unless you are targeting at developers who would have their own API keys already. This is used to identify your app and shut it down, among other things, if it's causing trouble for Dropbox.

The specific instance of this key you are trying to edit is what gets control back to your app after a user authenticates with their personal account. This needs to be kept in sync with the key you use for authentication when calling AppKeyPair appKeys = new AppKeyPair(APP_KEY, APP_SECRET);

You will not be able to modify the the data tag in that intent filter at runtime.




回答2:


The object appKeyPair.key contains the key that you want. I d'ont know what AppKeyPair appKeyPair = getAppKeyPair(); does, but I think you can remove it and put a simple string from the shared preferences instead of calling appKeyPair.key.



来源:https://stackoverflow.com/questions/14397107/read-informations-from-application-preferences-instead-from-androidmanifest-xml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!