Android Dropbox同步Api中出现奇怪错误
我注意到,在一些设备上,当我调用Android Dropbox同步Api中出现奇怪错误,android,nullpointerexception,dropbox-api,Android,Nullpointerexception,Dropbox Api,我注意到,在一些设备上,当我调用DbxAccountManager.getInstance时,我总是得到NullPointerException,但在大多数时间和设备上,代码工作没有任何问题 以下是我基本上正在做的事情: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity
DbxAccountManager.getInstance
时,我总是得到NullPointerException
,但在大多数时间和设备上,代码工作没有任何问题
以下是我基本上正在做的事情:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
//some initialization
mDbxAcctMgr = DbxAccountManager.getInstance(getApplicationContext(), appKey, appSecret);
}
其中DbxAccountManager.getInstance
调用Dropbox的同步API SDK
以下是跟踪:
04-20 22:36:52.565: E/AndroidRuntime(551): Uncaught handler: thread main exiting due to uncaught exception
04-20 22:36:52.575: E/AndroidRuntime(551): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nobeid.XXX/com.nobeid.XXX.Settings}: java.lang.NullPointerException
04-20 22:36:52.575: E/AndroidRuntime(551): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
04-20 22:36:52.575: E/AndroidRuntime(551): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
04-20 22:36:52.575: E/AndroidRuntime(551): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
04-20 22:36:52.575: E/AndroidRuntime(551): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
04-20 22:36:52.575: E/AndroidRuntime(551): at android.os.Handler.dispatchMessage(Handler.java:99)
04-20 22:36:52.575: E/AndroidRuntime(551): at android.os.Looper.loop(Looper.java:123)
04-20 22:36:52.575: E/AndroidRuntime(551): at android.app.ActivityThread.main(ActivityThread.java:4203)
04-20 22:36:52.575: E/AndroidRuntime(551): at java.lang.reflect.Method.invokeNative(Native Method)
04-20 22:36:52.575: E/AndroidRuntime(551): at java.lang.reflect.Method.invoke(Method.java:521)
04-20 22:36:52.575: E/AndroidRuntime(551): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
04-20 22:36:52.575: E/AndroidRuntime(551): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
04-20 22:36:52.575: E/AndroidRuntime(551): at dalvik.system.NativeStart.main(Native Method)
04-20 22:36:52.575: E/AndroidRuntime(551): Caused by: java.lang.NullPointerException
04-20 22:36:52.575: E/AndroidRuntime(551): at com.dropbox.sync.android.DbxAccountManager.validateAppContext(DbxAccountManager.java:432)
04-20 22:36:52.575: E/AndroidRuntime(551): at com.dropbox.sync.android.DbxAccountManager.getInstance(DbxAccountManager.java:106)
04-20 22:36:52.575: E/AndroidRuntime(551): at com.dropbox.sync.android.DbxAccountManager.getInstance(DbxAccountManager.java:99)
04-20 22:36:52.575: E/AndroidRuntime(551): at com.nobeid.XXX.Settings.onCreate(Settings.java:198)
04-20 22:36:52.575: E/AndroidRuntime(551): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
04-20 22:36:52.575: E/AndroidRuntime(551): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
04-20 22:36:52.575: E/AndroidRuntime(551): ... 11 more
有人知道如何解决这个问题吗。任何线索都会有帮助
编辑1:
以下是从Dropbox的SDK中获取的DBXAAccountManagergetInstance
static DbxAccountManager getInstance(Context applicationContext, DbxConfig config) {
if (null == applicationContext) throw new NullPointerException("applicationContext shouldn't be null.");
if (null == config) throw new NullPointerException("config shouldn't be null.");
AppConfigStrings appStrings = validateAppContext(applicationContext, config);
CoreConfig coreConfig = new CoreConfig(config, CoreConfig.Hosts.DEFAULT, appStrings.userAgent, appStrings.appVersion, appStrings.deviceId);
synchronized (sInitializeLock) {
if (null == sInstance) {
sInstance = new DbxAccountManager(new CoreAccountManager(applicationContext, coreConfig));
}
else if (!config.equals(sInstance.mAcctMgr.getConfig())) {
throw new ConfigurationMismatchException("Dropbox.ensureInitialized called with different configuration.");
}
return sInstance;
}
}
和验证AppContext
:
private static AppConfigStrings validateAppContext(Context appContext, DbxConfig config)
{
Context testContext = appContext.getApplicationContext();
if (testContext != appContext) {
throw new IllegalArgumentException("The provided context wasn't an application context.");
}
PackageInfo pi = null;
try
{
PackageManager pm = appContext.getPackageManager();
pi = pm.getPackageInfo(appContext.getPackageName(), 4101);
}
catch (PackageManager.NameNotFoundException e)
{
CoreLogger.getGlobal().logAndThrow(TAG, new RuntimeException("Unable to get package info for app package.", e));
}
CoreAssert.isTrue(null != pi);
Set requiredActivities = new HashSet();
requiredActivities.add(DbxAuthActivity.class.getName());
requiredActivities.add(AuthActivity.class.getName());
for (ActivityInfo info : pi.activities) {
requiredActivities.remove(info.name);
}
if (!requiredActivities.isEmpty()) {
throw new IllegalStateException("Required Sync API Activity isn't included in application manifest: " + TextUtils.join(", ", requiredActivities));
}
Set requiredServices = new HashSet();
requiredServices.add(DbxSyncService.class.getName());
for (ServiceInfo info : pi.services) {
requiredServices.remove(info.name);
}
if (!requiredServices.isEmpty()) {
throw new IllegalStateException("Required Sync API Service isn't included in application manifest: " + TextUtils.join(", ", requiredServices));
}
Set requiredPermissions = new HashSet();
requiredPermissions.add("android.permission.INTERNET");
requiredPermissions.add("android.permission.ACCESS_NETWORK_STATE");
for (String perm : pi.requestedPermissions) {
requiredPermissions.remove(perm);
}
if (!requiredPermissions.isEmpty()) {
throw new IllegalStateException("Required Sync API permission isn't requested in application manifest: " + TextUtils.join(", ", requiredPermissions));
}
AuthActivity.checkAppBeforeAuth(appContext, config.appKey, false);
String locale = Locale.getDefault().toString();
StringBuilder sbUserAgent = new StringBuilder();
sbUserAgent.append(appContext.getPackageName()).append('/').append(pi.versionCode);
sbUserAgent.append(' ').append("DropboxSync/").append(SDK_VERSION_NAME);
sbUserAgent.append(" (Android; ").append(CoreAndroidUtil.getSystemVersion()).append("; ").append(Build.MANUFACTURER).append(" ").append(Build.MODEL).append(" ").append(Build.CPU_ABI).append("; ").append(locale).append(")");
StringBuilder sbAppVersion = new StringBuilder();
sbAppVersion.append(pi.versionCode).append(' ');
sbAppVersion.append("Dropbox-Sync-Sdk-Android/").append(SDK_VERSION_NAME);
return new AppConfigStrings(sbUserAgent.toString(), sbAppVersion.toString(), CoreAndroidUtil.getDeviceId(appContext));
}
第432行是:requiredServices.remove(info.name)代码>
编辑2:
从问题中删除不相关(误导)的内容。(感谢Commonware)在联系Dropbox的开发人员并进行了大量调试后,发现问题是由于在某些操作系统版本上出现了一些未记录的行为后,同步SDK导致的。将在下一次API更新(1.0.8)中发布修复程序。在联系Dropbox的开发人员并进行大量调试后,发现该问题是由于在某些操作系统版本上出现一些未记录的行为后,同步SDK导致的。将在下一次API更新(1.0.8)中发布修复程序。“调用getApplicationContext()时,我总是会收到NullPointerException”-而不是根据此堆栈跟踪。根据这个堆栈跟踪,在DbxAccountManager
上调用getInstance()
时,您会得到一个NullPointerException
。如果Dropbox代码是开源的,那么您可以看到该行的内容。否则,请联系他们的开发人员支持团队,假设他们有一个。@Commonware让我重新表述我的问题:在某些设备上getApplicationContext()
总是抛出NPE
,而在其他设备上它从来不会抛出。不过,代码运行的设备比例要高得多。谢谢你的回答,我会研究一下,然后在我能“在某些设备上getApplicationContext()总是抛出NPE,在其他设备上它从来没有”——我重复一遍:这个堆栈跟踪没有显示getApplicationContext()
抛出NullPointerException
@Commonware我用getInstance()编辑了我的问题
Dropbox SDK中的函数“当我调用getApplicationContext()时,总是得到NullPointerException”——这与堆栈跟踪无关。根据这个堆栈跟踪,在DbxAccountManager
上调用getInstance()
时,您会得到一个NullPointerException
。如果Dropbox代码是开源的,那么您可以看到该行的内容。否则,请联系他们的开发人员支持团队,假设他们有一个。@Commonware让我重新表述我的问题:在某些设备上getApplicationContext()
总是抛出NPE
,而在其他设备上它从来不会抛出。不过,代码运行的设备比例要高得多。谢谢你的回答,我会研究一下,然后在我能“在某些设备上getApplicationContext()总是抛出NPE,在其他设备上它从来没有”——我重复一遍:这个堆栈跟踪没有显示getApplicationContext()
抛出NullPointerException
@Commonware我用getInstance()编辑了我的问题
Dropbox SDK中的函数