Reputation: 649
I noticed that on some devices I always get NullPointerException
when I call DbxAccountManager.getInstance
, but most of the time and on most devices the code works without any problem.
Here is what I am basically doing:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
//some initialization
mDbxAcctMgr = DbxAccountManager.getInstance(getApplicationContext(), appKey, appSecret);
}
Where DbxAccountManager.getInstance
calls Dropbox's Sync API SDK.
Here is the trace:
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
Does anyone know how to solve this issue. Any thread would help.
Edit 1:
Here is DbxAccountManager getInstance
taken from Dropbox's SDK
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;
}
}
and validateAppContext
:
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));
}
and line 432 is: requiredServices.remove(info.name);
Edit 2: Removed irrelevant (misleading) stuff from question. (thanks CommonsWare)
Upvotes: 1
Views: 1393
Reputation: 649
After contacting Dropbox's devs and some heavy debugging, it turned out that the issue was caused by the Sync SDK after some undocumented behavior on some os versions. A fix will be issued in their next API update (1.0.8).
Upvotes: 1