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中获取的DBXAAccountManager
getInstance

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中的函数