我已经成功开发了一个应用程序,我想将数据库存储在保管箱中。所以我正在使用 dropbox-android-sdk-1.5.4 示例,这对我来说很好。
我的问题是,当我将此 sdk 示例应用程序集成到我的应用程序中并进行登录过程时,它显示一个错误:
“您手机上的另一个应用程序可能试图冒充您当前正在使用的应用程序。恶意应用程序无法访问您的帐户,但作为预防措施,已禁用与 Dropbox 的链接。请联系 support@dropbox.com。”
只是一个猜测,但我认为如果您尝试在自己的应用程序中重用示例应用程序中的应用程序密钥和秘密,而不是通过https://www.dropbox.com/developers/apps/创建新应用程序,这可能会发生创建和使用该密钥和秘密。
我知道这是一个老问题,但是对于可能遇到相同问题的未来用户来说,还有另一种可能性让我感到痛苦:
如果在身份验证过程中遇到错误消息,例如“您手机上的另一个应用程序可能正试图冒充您当前使用的应用程序”。这意味着手机上安装的多个应用程序为单个应用程序密钥注册了回调活动。您可以通过删除其中一个有问题的应用程序或切换到新的应用程序密钥来修复此错误。
我通过安装同一个应用程序的不同版本(调试和发布)来解决这个问题。
我刚刚检查了 SDK 的代码,这是因为您有 2 个应用程序处理 Dropbox 登录页面使用的回调 URL 的相同方案。
因此,当用户使用浏览器登录 Dropbox 时,成功登录后,浏览器将打开您的 Dropbox 应用的唯一 IDdb-123456789://somepath
在哪里。123456789
如果您在处理 URL 方案的设备上安装了多个应用程序db-123456789
,您最终将收到该警告。
我想当浏览器db-123456789
通过专门处理该方案使用该方案提供访问令牌时,恶意应用程序可以捕获访问令牌,因此会发出警告。
这是因为不止一个应用程序使用相同的 appKey。检查您的应用程序的 appKey - 每个应用程序必须是唯一的。从系统应用列表中删除所有与 Dropbox 相关的应用。在我的情况下,有一个带有另一个 applicationId 的应用程序,我没有在启动屏幕上看到它。
当我从不同版本的 api 迁移时,我遇到了同样的问题。我在 AndroidManifest.xml 文件中有两个 AuthActivity 实例,即
<activity
android:name="com.dropbox.client2.android.AuthActivity"
android:configChanges="orientation|keyboard"
android:launchMode="singleTask" >
<intent-filter>
<!-- <data android:scheme="db-c9buqx8hii5bxx8" /> -->
<data android:scheme="xxxxxxxxxxx" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="com.dropbox.core.android.AuthActivity"
android:configChanges="orientation|keyboard"
android:launchMode="singleTask">
<intent-filter>
<!-- Insert your app key after “db- ...” -->
<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>
</activity>
经过一些调试后,我发现了这一点,并注意到保管箱库对连接意图进行了检查。如果 Dropbox 发现多个活动,如果会引发安全警报错误。我用下面的代码重复了相同的检查,并将其放在主启动活动中。它将打印出具有相同 Dropbox 意图的活动,这让我知道发生了什么。
public static void showDropboxActivities(Context context)
{
Intent testIntent = new Intent(Intent.ACTION_VIEW);
String scheme = "db-" + DROPBOX_APP_KEY;
String uri = scheme + "://" + com.dropbox.core.android.AuthActivity.AUTH_VERSION + "/connect";
testIntent.setData(Uri.parse(uri));
PackageManager pm = context.getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(testIntent, 0);
Log.d("SomeApp", "------------- showDropboxActivities ------------");
for (ResolveInfo activity : activities)
{
Log.d("SomeApp", "activty = " + activity.toString());
Log.d("SomeApp", "activity.activityInfo = " + activity.activityInfo);
Log.d("SomeApp","..............");
}
}
最近有同样的问题,没有一个答案能解决这个问题。
它在尝试演示应用程序并为其使用相同的应用程序密钥后开始发生。看到这篇文章,但没有运气。
这是我解决这个问题的方法:
编辑:#3 可以替换为在应用#1 或#2 之后/之前清除应用程序的数据。