• bdPeter
  • NEWBIE
  • 100 Points
  • Member since 2013

  • Chatter
    Feed
  • 4
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 7
    Questions
  • 18
    Replies

In my hybrid Android app built with the Salesforce SDK, quite often (but not always), a subsequent login after the app logs out using the API  -- var sfOAuthPlugin = cordova.require("salesforce/plugin/oauth"); sfOAuthPlugin.logout(); -- fails. It is not only my app, I can easily reproduce this problem with the stock ContactExplorer sample from the SDK. The problem occurs more often when you logout and then subsequently login with a different login name. Problem description:

 

1. Enter name and password

2. In 2nd screen grant permission by taping Allow

3. After a few seconds, the first screen comes back up with name and password empty

 

Again, the problem is not consistent; sometimes I can re-login over and over. I tried with the 2.06 and 2.1 version of the SDK, and on a 2013 Nexus 7 with the latest Android 4.4.2 and emulators with Android 4.3 (they all show the problem). The ContactExplorer sample is built on Windows 7 with the latest SDK from Github without any changes on my part. Most of the time, re-installing the app solves the problem but here again, not consistently. I have not tested this functionality for a while so I cannot tell you when the problem crept in. Let me provide you with the logs and the ContactExplorer that I built.

 

When you have a chance, please take a look at the problem. Since I am close to shipping my app, I am hoping you will be able to reproduce this problem so it can be fixed in the next SDK release. If you need me to do some more expirementation, let me know.

 

Thanks

Peter

 

https://dl.dropboxusercontent.com/u/40554620/Logs/contact-explorer-login-after-logout.txt

https://dl.dropboxusercontent.com/u/40554620/Logs/contact-explorer-logout.txt

https://dl.dropboxusercontent.com/u/40554620/Logs/ContactExplorer.apk

 

 

 

 

A few months ago you guys mentioned that you were working on a file storage solution for SmartStore (for among other things, to allow safe and encrypted storage of objects larger than 1MB - the maximum field size in SmartStore).

 

Is this still the case and when do you expect such an SDK addition might become available? In my application I would like to store large documents, audio files,etc in SmartStore until they are ready to be uploaded as an attachment to selected Salesforce records. In my case, ideally the SmartStore handles files (or fields) equal to the maximum size of a Salesforce attachment.

 

Thanks

Peter

When my app is resumed (as a result of waking up the device after it is not used for a day), the first REST calls fail because apparently (according to the log) a new token must be acquired.

 

As a result my app is catching an exception. Then if the user manually retries (i.e. doing another action in the app that causes a REST SOQL call), everything works fine. The user is not asked to login again. Apparently a refresh token was successfully obtained.

 

See log at https://dl.dropboxusercontent.com/u/40554620/Logs/Resume-with-expired-token.txt for details.

To make sure I understand the responsibilities of the app: is the app expected to retry when the exception is caught or is the SDK responsible for a retry? I go either way; I just need to know whose responsibility it is so I can code it up properly.

 

To avoid (potentially complicated) retry handling all together, is there an option to force the SDK to always refresh the token when the app is resumed? I guess my app could issue some REST call on resume to accomplish this.

 

Thanks

Peter

 

  • September 12, 2013
  • Like
  • 0

In my hybrid app I am creating Attachment records in SmartStore (which later at the user's convenience can be uploaded to Salesforce). This is all working fine with the MockSmartStore. However, with the actual SmartStore on a device I am getting an NPObject exception (see 'Body' field in trace below).

 

Can the SmartStore handle a large string containing a base64 string?

 

Thanks

Peter

 

D/CordovaLog( 2137): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'smA
ttachments_a00i0000005SH72AAG' indexSpecs: [{"path":"ParentId","type":"string"},{"path":"TimeStamp","type":"integer"}]
D/CordovaLog( 2137): file:///android_asset/app/scripts/controllers/controllers.js: Line 747 : onAcceptAttachments: attac
hments soup registered, issuing write for attachments record
D/CordovaLog( 2137): file:///android_asset/app/scripts/controllers/controllers.js: Line 748 : onAcceptAttachments: {"Tim
eStamp":1377020402902,"Name":"1377020392246.jpg","Description":"","IsPrivate":false,"ParentId":"003i000000CsLkpAAF","Con
tentType":"image/jpeg","Body":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYF\nBgYGBwkIBgc
JBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoK\nCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKC
goKCgr/wAARCAHgAoADASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhM
UEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipK
TlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAE
CAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5O
kNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4
uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDyoAqS\ngbOO9NzhgN36U7yHV23AnBwcdqaV+beGxx6V+bqp0sfdpP5jCcMQ3T3qFgd+A2MHtU6xPI2
1iTn0\nphi8oMGGc9K1nzuO2g+ez5RklzmFgOGIxweK5DWPKGsKQ5BByMetdRdR7IsnBOOtcpf26S6yPLYk\nDnHvmoU5vRMpRjfU3dFiRpEkeQHkewHNdCi
hwQwx71zmgRtJc7UPpyRwK6REfy/v7sDg+lKnUcpa\nIc9rIayMSQWBx1x2qpLY3UTCeAA89DVoSAgo3brx1oKse/Aq1GNdt2HQrVKErxepNpWuC2uFgkYj\
n1ArstC8WmLBjvAMY4J7VwjQLImdn0NOhuZbM7myRkdPxrGeElO/IfQ4DN6Tly1tz23wz4jiv3DSS\nkgHJI7/5/rXf+F9Xton+1LIC3b2FfOnhnxXHanZJL
t5713/h/wAcwwjy5LgEqOMmudKpT9yx9DB4\naouZH0FomtrcRAB0BDDr6VtXt6DCPKcAkfMF715B4Q8Zi5fzIrlflxn5v8a7JPGCs6xREHI456Vt\nGrG3v
GVTDxlK6NbU7Z7iBpIEIfHp1rJtRdRSGQthQe4wau22t+ZEczqcH6Vn6rrFrGDI8oRV65ro\nXK1e5y8rTasbXh/WEiv3hkk6jJI7Vd8U/FPw14L0uTVvEGp
xwQRKWLOcV4d8Sf2iPD/w7t2aGXzb\ngD92iEZP19BXzD8UPjb4t+KOpSXWtalJ5IJ8m3U4ROvQV6OFoykr2PDzLMKeGvGO56l+0R+234i8\nazXPhrwOfst
gwKNcbf3jrz+Qr54u57idzPJJubOSWNMJlZtwcEGmMqhmbBYoOle1SUKdPTc+Lr4q\nriKnvMhWaR7jcqZx69KtLJcbNw4DYyAaqxRSGRzI+3I4xU0ccixhE
l/3iRk1gptN8zJjLTQW6nmz\n5nmcKAMGqE7yXCOVU5zngdK1EgwhmbOAeDjPNOWFFjyExzzVQbTvF3I5XJNtHDa5omtaj/x7QYDH\nH1rk9R8A66khml0sy
KRgtjrXrM93bwtjYCwPQHpWVceJbaElZ5YiS3UmqlFqXN1MvZwSep5Ja2Pi\nTwhqvnf2ZJGhPzZTgiuy0/Uzf2XnbCr9wR0rR1fxnoduS9zdRlM8dDXLax8
RtNj3GwhZ8/w4xmua\nvh1V0d2zWhiY0OptPBcK29Jty9cKO9W7SGW5AVwA38WK4C28R/ELUpc6NZShScAFMqQc+orf8O3X\njy0d5das4ogOozzXN9SlD4D
vp4+E3qjtbZrPyfsczbc/x1V8l0u2t0lDKpG0+tcL4z8c6hY6fI9s\noU/xYHPWtj4Waxf6roUd/qcm4uf3bfQ966KNCSl7zMsRioz91I6/bvHlu3PqBxVWR
wVdGXBB+/61\nMZpvKLKm5s4+lVbrLKVRsvnkCumMby1OZN2sJG0c1yjswBX8ia3dOiEr4kII7ZrH0613puuV5HQg\nVu6OiRqSEAAHB71T+LshpKS3Lxt4r
aHcXwO9ZuoRBuSflz19a2JmVlGUz8ozmsi+n8wPGgAAPbvV\n8sXBtBzNbMrTBiQoxgUqQgfMxxtPA702NLlW28FQOpqWRQAWMgxjnPas4KU4jTguoxtzZKo
cD2qM\nxoYyODn36VOSFQhG6qPxqvbDMrRueR0pyk17u4XbXkSRRmQgJ0FCxzR/KjA45J9adIxt02nPPamF\n2yAFxxxWjlHlt1HG1guGZ5drEH0H50yQBFz
JnB6HHFShDISXUdOCKhH+kofMdgFbAAFRKSSvuQkn\ndhGFZty8HPU1PGSpKyc474qCFWYbC3TpgUkCtg+cec0KSEnbYlD71Ygj5TilDbbUrkHPUYqN5Bnb\
njnOBTSj5KqccdDRLlvYabauPth+7ZOmVwc1GIBHOMybgOntSQM0RMM8g9qY0ju4IB4Pap9xQsJc1\ntSeRJdv3+/U9qiuYlEXlIAT2INOJdty8jIHSokfCG
NcZP8VNSTV7MpOy0GRRKTmUZIGODSOqAFlc\njg4IocgRlVbHPLVHAzSAhQCAeuaXPDa2olFvUVJ/Kj8t8sT0wPrViK5YRmM4BI71GgeCIlnyemB+\nNNRWu
W3oTlOM1Sk4u1yElYsKJFjdlUEd+etQlZfKZj2HIFWo42WP58k/WopQ+87XPPfFXOLa0CMl\nFaFYRKQG3YxwQBT33uhicHA+7mpVtyq+WZRn6VFM8auLYSZ
I7gVmm4/EU0n1uQxiOG5xsJ445+tS\nSTmEeZkckZxRIYjJ5aDJHXjpTUXzSRLwvbA5qkrbE+7bUUK0ibopunPIpFlmCnpk9CopEKqhiWYE\njgHH1qFJHhJ
aJ8NUStHYfS6Lgeefm4j5x1H41LbMEJCvn2xVb7XLGNjuGJAxipbWSMggkhh271qn\nFRumSpuWktiVsmTYueOtNZZd5chcAcAmlhcFGfeCx7mg7iuJhgd8G
lPkcdSlJrSxXvYPNtt5PIPf\n1rGmtCjM7PgDqRXRXAgkg2q46cgng1h32Njxk8HqRUxUIxtuZvmb7GWyhmIjQknvU1r5slwIw2FU\ngkHpUUa8MVY4HSnxy
+VKJcYz/FSje2uxLaLHj23+3+CpCTzC6soX0Fef2jypE4Xj5eD+dej3kQ1D\nwpfRhgw8gnHTpXmtvISdpfIXuKzqJRNY7F7TZCYSkseWzkE+laNth4tjYx7
VjrIGnAE+0HqCvStW\nAJHGW80DjnA61CTa8iXa59u3lmrtJ5QAww+73qjJZMhMrDj6fWtREMe55AQB97A61A772OU4brXz\nn1h83M9z6BU1ujKuIcru7dM
evWqsayLIVVyRjgmtqSzUKRyfRSPrVU2cqEsqDaR260nUk5XmOMEl\noYuqbhEwJ5x2rkYgH1yZmJxjaOO1drqdkDE6kkEc5HeuTtdOaW/luFbkcMD9amUeZ
tpFx
D/CordovaLog( 2137): file:///android_asset/app/components-min/angular/angular.js: Line 5754 : Error: Error calling metho
d on NPObject.
D/CordovaLog( 2137): at androidExec (file:///android_asset/app/scripts/vendor/cordova.js:863:48)
D/CordovaLog( 2137): at file:///android_asset/app/scripts/vendor/cordova.force.js:196:16
D/CordovaLog( 2137): at file:///android_asset/app/scripts/vendor/cordova.force.js:538:9
D/CordovaLog( 2137): at Object.upsertSoupEntries (file:///android_asset/app/scripts/vendor/cordova.force.js:531:9)
D/CordovaLog( 2137): at Object.writeRecords (file:///android_asset/app/scripts/services/services.js:1874:22)
D/CordovaLog( 2137): at file:///android_asset/app/scripts/controllers/controllers.js:751:31
D/CordovaLog( 2137): at file:///android_asset/app/components-min/angular/angular.js:6846:59
D/CordovaLog( 2137): at file:///android_asset/app/components-min/angular/angular.js:6846:59
D/CordovaLog( 2137): at file:///android_asset/app/components-min/angular/angular.js:6883:26
D/CordovaLog( 2137): at Object.$eval (file:///android_asset/app/components-min/angular/angular.js:8057:28)
D/CordovaLog( 2137): file:///android_asset/app/scripts/services/services.js: Line 364 : AttachHub.reportError: {}

Currently I am tweaking the source code of the SDK 2.0 to look for index.html in the 'app' instead of 'www' folder. As you know, AngularJS by default is using a folder named 'app'.

 

I am wondering, what is the best way to go forward, rename the folder to 'www' and make what ever adjustments are necessary in Angular, or continue tweaking the source code of the mobile SDK?

 

Is there a chance the www folder in the mobile SDK becomes configurable in the future?

 

Thanks

Peter

In the 1.5.3 SDK I modified ForceAppWithSmartStore.java (in SmartStore project) to call DBHelper.INSTANCE.reset (with "this" as argument) instead of DBOpenHelper.deleteDatabase (in Cleanup method) to avoid Javascript "NPObject" exceptions upon restart after logout. Note that these errors did not occur if killing the app from memory after logout.

 

I noticed in the 2.0 SDK that Cleanup method (now in SalesforceSDKManagerWithSmartStore.java) was changed to call the reset method of DBHelper. However, I still see the NPObject exceptions (see log below for details) immediately after login after having called logout in the app. The app is attemting to store data retrieved with forcetkClient into a SmartStore soup.

 

Is there a way around this other than telling the user to kill the app after calling oAuth logout?

 

Thanks

Peter

 

D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 42 : jslog: onDeviceReady: Cordova ready
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 42 : jslog: salesforceSessionRefreshed
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 42 : jslog: {"clientId":"redacted","loginUrl":"https://login.salesforce.com","proxyUrl":null,"authzHeader":"Authorization","refreshToken":"5Aep861z80Xevi74eXywJDHOv_n6EqA6tDKCn7kXW9x7n8fTM9BUcPO69HhmFJ0rk2V7F30OAuBTHyP_zB.cWR1","sessionId":"00Di0000000awW3!AQsAQDbftkiIid9UABGRlHKFTdeqqf8r5uur8_CGJuUQcpWRBb_qon_5l1fWnvnwnY9Rj0I1mrqA8J8cLp2TRzwx5lye_5BG","apiVersion":"v28.0","instanceUrl":"https://na15.salesforce.com","asyncAjax":true,"userAgentString":"SalesforceMobileSDK/2.0.1 android mobile/4.2 (Android SDK built for x86) AttachHub/1.0 Hybrid","authCallback":null}
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 42 : jslog: calling forceTkClientObserver
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1497 : forcetkClientObserver authenticated=true ready=true
D/CordovaLog( 2150): file:///android_asset/app/scripts/controllers/controllers.js: Line 535 : onForceTkReady={"authenticated":true}
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1542 : ForceTk describeGlobal
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'smMetadata' indexSpecs: [{"path":"Name","type":"string"}]
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1520 : ForceTk SOQL Query=SELECT Id, Name, ObjectType__c, DisplayFields__c, Field1__c, Operator1__c, Value1__c FROM AttachHub_Filter__c ORDER BY Name
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1564 : ForceTk describe Contact
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'smMetadata' indexSpecs: [{"path":"Name","type":"string"}]
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1520 : ForceTk SOQL Query=SELECT COUNT(Id) FROM Contact WHERE Name LIKE '%tim%'
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1520 : ForceTk SOQL Query=SELECT Birthdate, Email, Name FROM Contact WHERE Name LIKE '%tim%' ORDER BY Birthdate LIMIT 5 OFFSET 0
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'smUpdates_a00i0000005SH72AAG' indexSpecs: [{"path":"_recordId","type":"string"},{"path":"_numAtt","type":"integer"},{"path":"_numUpdt","type":"integer"}]
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 504 : SmartStore.querySoup: 'smUpdates_a00i0000005SH72AAG' indexPath: _recordId
D/CordovaLog( 2150): file:///android_asset/app/components-min/angular/angular.js: Line 5754 : Error: Error calling method on NPObject.
D/CordovaLog( 2150): at androidExec (file:///android_asset/app/scripts/vendor/cordova.js:863:48)
D/CordovaLog( 2150): at file:///android_asset/app/scripts/vendor/cordova.force.js:196:16
D/CordovaLog( 2150): at Object.querySoup (file:///android_asset/app/scripts/vendor/cordova.force.js:505:9)
D/CordovaLog( 2150): at Object.query (file:///android_asset/app/scripts/services/services.js:1799:22)
D/CordovaLog( 2150): at file:///android_asset/app/scripts/services/services.js:813:24
D/CordovaLog( 2150): at file:///android_asset/app/components-min/angular/angular.js:6846:59
D/CordovaLog( 2150): at file:///android_asset/app/components-min/angular/angular.js:6883:26
D/CordovaLog( 2150): at Object.$eval (file:///android_asset/app/components-min/angular/angular.js:8057:28)
D/CordovaLog( 2150): at Object.$digest (file:///android_asset/app/components-min/angular/angular.js:7922:25)
D/CordovaLog( 2150): at Object.$apply (file:///android_asset/app/components-min/angular/angular.js:8143:24)
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'Contacts' indexSpecs: [{"path":"Id","type":"string"},{"path":"Birthdate","type":"string"},{"path":"Email","type":"string"},{"path":"Name","type":"string"}]
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 504 : SmartStore.querySoup: 'Contacts' indexPath: Id
D/CordovaLog( 2150): file:///android_asset/app/components-min/angular/angular.js: Line 5754 : Error: Error calling method on NPObject.
D/CordovaLog( 2150): at androidExec (file:///android_asset/app/scripts/vendor/cordova.js:863:48)
D/CordovaLog( 2150): at file:///android_asset/app/scripts/vendor/cordova.force.js:196:16
D/CordovaLog( 2150): at Object.querySoup (file:///android_asset/app/scripts/vendor/cordova.force.js:505:9)
D/CordovaLog( 2150): at Object.query (file:///android_asset/app/scripts/services/services.js:1799:22)
D/CordovaLog( 2150): at file:///android_asset/app/scripts/controllers/controllers.js:1858:28
D/CordovaLog( 2150): at file:///android_asset/app/scripts/controllers/controllers.js:1862:13
D/CordovaLog( 2150): at file:///android_asset/app/components-min/angular/angular.js:6846:59
D/CordovaLog( 2150): at file:///android_asset/app/components-min/angular/angular.js:6883:26
D/CordovaLog( 2150): at Object.$eval (file:///android_asset/app/components-min/angular/angular.js:8057:28)
D/CordovaLog( 2150): at Object.$digest (file:///android_asset/app/components-min/angular/angular.js:7922:25)

 

 

This weekend I upgraded from SDK 1.5.3 to 2.0. My Android hybrid app extends SalesforceDroidGapActivity (mostly to do some initialization for a custom Cordova plugin used in the app). The AndroidManifest.xml mentions my activity as the main activity instead of SalesforceDroidGapActivity.

 

In my app I allow customers to do an oAuth logout so they can switch orgs if necessary. In SDK 1.5.3 this was working just fine. In SDK 2.0 I am seeing exceptions (see stacktrace below for details) and the app crashes. However, if I mention SalesforceDroidGapActivity in AndroidManifest.xml instead of my derived class, oAuth Logout works just fine, and the login page comes up just fine. Of course, consequently my plugin no longer works so I need to get some resolution here.

 

Is deriving a subclass from SalesforceDroidGapActivity in SDK 2.0 still supported, and if yes, is there anything I need to add to the derived class to allow oAuth Logout? Note that logout reported success, the problem apparently occurs somewhere on the way to the login page.

 

Thanks

Peter

 

I/ActivityManager( 1209): START u0 {flg=0x10000000 cmp=com.betsydog.attachhub/com.salesforce.androidsdk.ui.sfhybrid.Sale
sforceDroidGapActivity} from pid 4776
D/AndroidRuntime( 4776): Shutting down VM
W/dalvikvm( 4776): threadid=1: thread exiting with uncaught exception (group=0xb4d43908)
D/dalvikvm( 4795): GC_CONCURRENT freed 283K, 15% free 2448K/2848K, paused 6ms+0ms, total 8ms
E/AndroidRuntime( 4776): FATAL EXCEPTION: main
E/AndroidRuntime( 4776): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.betsydog
.attachhub/com.salesforce.androidsdk.ui.sfhybrid.SalesforceDroidGapActivity}; have you declared this activity in your An
droidManifest.xml?
E/AndroidRuntime( 4776): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1618)
E/AndroidRuntime( 4776): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
E/AndroidRuntime( 4776): at android.app.ContextImpl.startActivity(ContextImpl.java:949)
E/AndroidRuntime( 4776): at android.app.ContextImpl.startActivity(ContextImpl.java:931)
E/AndroidRuntime( 4776): at android.content.ContextWrapper.startActivity(ContextWrapper.java:284)
E/AndroidRuntime( 4776): at com.salesforce.androidsdk.app.SalesforceSDKManager.startLoginPage(SalesforceSDKManage
r.java:484)
E/AndroidRuntime( 4776): at com.salesforce.androidsdk.app.SalesforceSDKManager$1.run(SalesforceSDKManager.java:53
5)
E/AndroidRuntime( 4776): at android.accounts.AccountManager$Future2Task$1.run(AccountManager.java:1556)
E/AndroidRuntime( 4776): at android.os.Handler.handleCallback(Handler.java:725)
E/AndroidRuntime( 4776): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 4776): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 4776): at android.app.ActivityThread.main(ActivityThread.java:5039)
E/AndroidRuntime( 4776): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 4776): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 4776): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime( 4776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)

In my hybrid Android app built with the Salesforce SDK, quite often (but not always), a subsequent login after the app logs out using the API  -- var sfOAuthPlugin = cordova.require("salesforce/plugin/oauth"); sfOAuthPlugin.logout(); -- fails. It is not only my app, I can easily reproduce this problem with the stock ContactExplorer sample from the SDK. The problem occurs more often when you logout and then subsequently login with a different login name. Problem description:

 

1. Enter name and password

2. In 2nd screen grant permission by taping Allow

3. After a few seconds, the first screen comes back up with name and password empty

 

Again, the problem is not consistent; sometimes I can re-login over and over. I tried with the 2.06 and 2.1 version of the SDK, and on a 2013 Nexus 7 with the latest Android 4.4.2 and emulators with Android 4.3 (they all show the problem). The ContactExplorer sample is built on Windows 7 with the latest SDK from Github without any changes on my part. Most of the time, re-installing the app solves the problem but here again, not consistently. I have not tested this functionality for a while so I cannot tell you when the problem crept in. Let me provide you with the logs and the ContactExplorer that I built.

 

When you have a chance, please take a look at the problem. Since I am close to shipping my app, I am hoping you will be able to reproduce this problem so it can be fixed in the next SDK release. If you need me to do some more expirementation, let me know.

 

Thanks

Peter

 

https://dl.dropboxusercontent.com/u/40554620/Logs/contact-explorer-login-after-logout.txt

https://dl.dropboxusercontent.com/u/40554620/Logs/contact-explorer-logout.txt

https://dl.dropboxusercontent.com/u/40554620/Logs/ContactExplorer.apk

 

 

 

 

Hi,

I am trying to upload my Hybrid app to Google Play.

I am getting the error:

 

Failed to run aapt dump badging:
ERROR getting 'name' attribute: attribute is not a string value

 

I compared my Manifest.xml with the ContactExplorer and it looks identical.

ContactExplorer does not give this error when I pass it through aapt (using aapd d badging), but SmartStoreExplorer does.

 

Since my app using the SmartStore library, could this be a bug in the library?

A few months ago you guys mentioned that you were working on a file storage solution for SmartStore (for among other things, to allow safe and encrypted storage of objects larger than 1MB - the maximum field size in SmartStore).

 

Is this still the case and when do you expect such an SDK addition might become available? In my application I would like to store large documents, audio files,etc in SmartStore until they are ready to be uploaded as an attachment to selected Salesforce records. In my case, ideally the SmartStore handles files (or fields) equal to the maximum size of a Salesforce attachment.

 

Thanks

Peter

When my app is resumed (as a result of waking up the device after it is not used for a day), the first REST calls fail because apparently (according to the log) a new token must be acquired.

 

As a result my app is catching an exception. Then if the user manually retries (i.e. doing another action in the app that causes a REST SOQL call), everything works fine. The user is not asked to login again. Apparently a refresh token was successfully obtained.

 

See log at https://dl.dropboxusercontent.com/u/40554620/Logs/Resume-with-expired-token.txt for details.

To make sure I understand the responsibilities of the app: is the app expected to retry when the exception is caught or is the SDK responsible for a retry? I go either way; I just need to know whose responsibility it is so I can code it up properly.

 

To avoid (potentially complicated) retry handling all together, is there an option to force the SDK to always refresh the token when the app is resumed? I guess my app could issue some REST call on resume to accomplish this.

 

Thanks

Peter

 

  • September 12, 2013
  • Like
  • 0

In my hybrid app I am creating Attachment records in SmartStore (which later at the user's convenience can be uploaded to Salesforce). This is all working fine with the MockSmartStore. However, with the actual SmartStore on a device I am getting an NPObject exception (see 'Body' field in trace below).

 

Can the SmartStore handle a large string containing a base64 string?

 

Thanks

Peter

 

D/CordovaLog( 2137): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'smA
ttachments_a00i0000005SH72AAG' indexSpecs: [{"path":"ParentId","type":"string"},{"path":"TimeStamp","type":"integer"}]
D/CordovaLog( 2137): file:///android_asset/app/scripts/controllers/controllers.js: Line 747 : onAcceptAttachments: attac
hments soup registered, issuing write for attachments record
D/CordovaLog( 2137): file:///android_asset/app/scripts/controllers/controllers.js: Line 748 : onAcceptAttachments: {"Tim
eStamp":1377020402902,"Name":"1377020392246.jpg","Description":"","IsPrivate":false,"ParentId":"003i000000CsLkpAAF","Con
tentType":"image/jpeg","Body":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYF\nBgYGBwkIBgc
JBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoK\nCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKC
goKCgr/wAARCAHgAoADASIA\nAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\nAAF9AQIDAAQRBRIhM
UEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\nODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipK
TlJWWl5iZmqKjpKWm\np6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\nAwEBAQEBAQEBAQAAAAAAAAE
CAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\nBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5O
kNERUZHSElK\nU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\nuLm6wsPExcbHyMnK0tPU1dbX2Nna4
uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDyoAqS\ngbOO9NzhgN36U7yHV23AnBwcdqaV+beGxx6V+bqp0sfdpP5jCcMQ3T3qFgd+A2MHtU6xPI2
1iTn0\nphi8oMGGc9K1nzuO2g+ez5RklzmFgOGIxweK5DWPKGsKQ5BByMetdRdR7IsnBOOtcpf26S6yPLYk\nDnHvmoU5vRMpRjfU3dFiRpEkeQHkewHNdCi
hwQwx71zmgRtJc7UPpyRwK6REfy/v7sDg+lKnUcpa\nIc9rIayMSQWBx1x2qpLY3UTCeAA89DVoSAgo3brx1oKse/Aq1GNdt2HQrVKErxepNpWuC2uFgkYj\
n1ArstC8WmLBjvAMY4J7VwjQLImdn0NOhuZbM7myRkdPxrGeElO/IfQ4DN6Tly1tz23wz4jiv3DSS\nkgHJI7/5/rXf+F9Xton+1LIC3b2FfOnhnxXHanZJL
t5713/h/wAcwwjy5LgEqOMmudKpT9yx9DB4\naouZH0FomtrcRAB0BDDr6VtXt6DCPKcAkfMF715B4Q8Zi5fzIrlflxn5v8a7JPGCs6xREHI456Vt\nGrG3v
GVTDxlK6NbU7Z7iBpIEIfHp1rJtRdRSGQthQe4wau22t+ZEczqcH6Vn6rrFrGDI8oRV65ro\nXK1e5y8rTasbXh/WEiv3hkk6jJI7Vd8U/FPw14L0uTVvEGp
xwQRKWLOcV4d8Sf2iPD/w7t2aGXzb\ngD92iEZP19BXzD8UPjb4t+KOpSXWtalJ5IJ8m3U4ROvQV6OFoykr2PDzLMKeGvGO56l+0R+234i8\nazXPhrwOfst
gwKNcbf3jrz+Qr54u57idzPJJubOSWNMJlZtwcEGmMqhmbBYoOle1SUKdPTc+Lr4q\nriKnvMhWaR7jcqZx69KtLJcbNw4DYyAaqxRSGRzI+3I4xU0ccixhE
l/3iRk1gptN8zJjLTQW6nmz\n5nmcKAMGqE7yXCOVU5zngdK1EgwhmbOAeDjPNOWFFjyExzzVQbTvF3I5XJNtHDa5omtaj/x7QYDH\nH1rk9R8A66khml0sy
KRgtjrXrM93bwtjYCwPQHpWVceJbaElZ5YiS3UmqlFqXN1MvZwSep5Ja2Pi\nTwhqvnf2ZJGhPzZTgiuy0/Uzf2XnbCr9wR0rR1fxnoduS9zdRlM8dDXLax8
RtNj3GwhZ8/w4xmua\nvh1V0d2zWhiY0OptPBcK29Jty9cKO9W7SGW5AVwA38WK4C28R/ELUpc6NZShScAFMqQc+orf8O3X\njy0d5das4ogOozzXN9SlD4D
vp4+E3qjtbZrPyfsczbc/x1V8l0u2t0lDKpG0+tcL4z8c6hY6fI9s\noU/xYHPWtj4Waxf6roUd/qcm4uf3bfQ966KNCSl7zMsRioz91I6/bvHlu3PqBxVWR
wVdGXBB+/61\nMZpvKLKm5s4+lVbrLKVRsvnkCumMby1OZN2sJG0c1yjswBX8ia3dOiEr4kII7ZrH0613puuV5HQg\nVu6OiRqSEAAHB71T+LshpKS3Lxt4r
aHcXwO9ZuoRBuSflz19a2JmVlGUz8ozmsi+n8wPGgAAPbvV\n8sXBtBzNbMrTBiQoxgUqQgfMxxtPA702NLlW28FQOpqWRQAWMgxjnPas4KU4jTguoxtzZKo
cD2qM\nxoYyODn36VOSFQhG6qPxqvbDMrRueR0pyk17u4XbXkSRRmQgJ0FCxzR/KjA45J9adIxt02nPPamF\n2yAFxxxWjlHlt1HG1guGZ5drEH0H50yQBFz
JnB6HHFShDISXUdOCKhH+kofMdgFbAAFRKSSvuQkn\ndhGFZty8HPU1PGSpKyc474qCFWYbC3TpgUkCtg+cec0KSEnbYlD71Ygj5TilDbbUrkHPUYqN5Bnb\
njnOBTSj5KqccdDRLlvYabauPth+7ZOmVwc1GIBHOMybgOntSQM0RMM8g9qY0ju4IB4Pap9xQsJc1\ntSeRJdv3+/U9qiuYlEXlIAT2INOJdty8jIHSokfCG
NcZP8VNSTV7MpOy0GRRKTmUZIGODSOqAFlc\njg4IocgRlVbHPLVHAzSAhQCAeuaXPDa2olFvUVJ/Kj8t8sT0wPrViK5YRmM4BI71GgeCIlnyemB+\nNNRWu
W3oTlOM1Sk4u1yElYsKJFjdlUEd+etQlZfKZj2HIFWo42WP58k/WopQ+87XPPfFXOLa0CMl\nFaFYRKQG3YxwQBT33uhicHA+7mpVtyq+WZRn6VFM8auLYSZ
I7gVmm4/EU0n1uQxiOG5xsJ445+tS\nSTmEeZkckZxRIYjJ5aDJHXjpTUXzSRLwvbA5qkrbE+7bUUK0ibopunPIpFlmCnpk9CopEKqhiWYE\njgHH1qFJHhJ
aJ8NUStHYfS6Lgeefm4j5x1H41LbMEJCvn2xVb7XLGNjuGJAxipbWSMggkhh271qn\nFRumSpuWktiVsmTYueOtNZZd5chcAcAmlhcFGfeCx7mg7iuJhgd8G
lPkcdSlJrSxXvYPNtt5PIPf\n1rGmtCjM7PgDqRXRXAgkg2q46cgng1h32Njxk8HqRUxUIxtuZvmb7GWyhmIjQknvU1r5slwIw2FU\ngkHpUUa8MVY4HSnxy
+VKJcYz/FSje2uxLaLHj23+3+CpCTzC6soX0Fef2jypE4Xj5eD+dej3kQ1D\nwpfRhgw8gnHTpXmtvISdpfIXuKzqJRNY7F7TZCYSkseWzkE+laNth4tjYx7
VjrIGnAE+0HqCvStW\nAJHGW80DjnA61CTa8iXa59u3lmrtJ5QAww+73qjJZMhMrDj6fWtREMe55AQB97A61A772OU4brXz\nn1h83M9z6BU1ujKuIcru7dM
evWqsayLIVVyRjgmtqSzUKRyfRSPrVU2cqEsqDaR260nUk5XmOMEl\noYuqbhEwJ5x2rkYgH1yZmJxjaOO1drqdkDE6kkEc5HeuTtdOaW/luFbkcMD9amUeZ
tpFx
D/CordovaLog( 2137): file:///android_asset/app/components-min/angular/angular.js: Line 5754 : Error: Error calling metho
d on NPObject.
D/CordovaLog( 2137): at androidExec (file:///android_asset/app/scripts/vendor/cordova.js:863:48)
D/CordovaLog( 2137): at file:///android_asset/app/scripts/vendor/cordova.force.js:196:16
D/CordovaLog( 2137): at file:///android_asset/app/scripts/vendor/cordova.force.js:538:9
D/CordovaLog( 2137): at Object.upsertSoupEntries (file:///android_asset/app/scripts/vendor/cordova.force.js:531:9)
D/CordovaLog( 2137): at Object.writeRecords (file:///android_asset/app/scripts/services/services.js:1874:22)
D/CordovaLog( 2137): at file:///android_asset/app/scripts/controllers/controllers.js:751:31
D/CordovaLog( 2137): at file:///android_asset/app/components-min/angular/angular.js:6846:59
D/CordovaLog( 2137): at file:///android_asset/app/components-min/angular/angular.js:6846:59
D/CordovaLog( 2137): at file:///android_asset/app/components-min/angular/angular.js:6883:26
D/CordovaLog( 2137): at Object.$eval (file:///android_asset/app/components-min/angular/angular.js:8057:28)
D/CordovaLog( 2137): file:///android_asset/app/scripts/services/services.js: Line 364 : AttachHub.reportError: {}

In the 1.5.3 SDK I modified ForceAppWithSmartStore.java (in SmartStore project) to call DBHelper.INSTANCE.reset (with "this" as argument) instead of DBOpenHelper.deleteDatabase (in Cleanup method) to avoid Javascript "NPObject" exceptions upon restart after logout. Note that these errors did not occur if killing the app from memory after logout.

 

I noticed in the 2.0 SDK that Cleanup method (now in SalesforceSDKManagerWithSmartStore.java) was changed to call the reset method of DBHelper. However, I still see the NPObject exceptions (see log below for details) immediately after login after having called logout in the app. The app is attemting to store data retrieved with forcetkClient into a SmartStore soup.

 

Is there a way around this other than telling the user to kill the app after calling oAuth logout?

 

Thanks

Peter

 

D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 42 : jslog: onDeviceReady: Cordova ready
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 42 : jslog: salesforceSessionRefreshed
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 42 : jslog: {"clientId":"redacted","loginUrl":"https://login.salesforce.com","proxyUrl":null,"authzHeader":"Authorization","refreshToken":"5Aep861z80Xevi74eXywJDHOv_n6EqA6tDKCn7kXW9x7n8fTM9BUcPO69HhmFJ0rk2V7F30OAuBTHyP_zB.cWR1","sessionId":"00Di0000000awW3!AQsAQDbftkiIid9UABGRlHKFTdeqqf8r5uur8_CGJuUQcpWRBb_qon_5l1fWnvnwnY9Rj0I1mrqA8J8cLp2TRzwx5lye_5BG","apiVersion":"v28.0","instanceUrl":"https://na15.salesforce.com","asyncAjax":true,"userAgentString":"SalesforceMobileSDK/2.0.1 android mobile/4.2 (Android SDK built for x86) AttachHub/1.0 Hybrid","authCallback":null}
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 42 : jslog: calling forceTkClientObserver
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1497 : forcetkClientObserver authenticated=true ready=true
D/CordovaLog( 2150): file:///android_asset/app/scripts/controllers/controllers.js: Line 535 : onForceTkReady={"authenticated":true}
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1542 : ForceTk describeGlobal
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'smMetadata' indexSpecs: [{"path":"Name","type":"string"}]
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1520 : ForceTk SOQL Query=SELECT Id, Name, ObjectType__c, DisplayFields__c, Field1__c, Operator1__c, Value1__c FROM AttachHub_Filter__c ORDER BY Name
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1564 : ForceTk describe Contact
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'smMetadata' indexSpecs: [{"path":"Name","type":"string"}]
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1520 : ForceTk SOQL Query=SELECT COUNT(Id) FROM Contact WHERE Name LIKE '%tim%'
D/CordovaLog( 2150): file:///android_asset/app/scripts/services/services.js: Line 1520 : ForceTk SOQL Query=SELECT Birthdate, Email, Name FROM Contact WHERE Name LIKE '%tim%' ORDER BY Birthdate LIMIT 5 OFFSET 0
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'smUpdates_a00i0000005SH72AAG' indexSpecs: [{"path":"_recordId","type":"string"},{"path":"_numAtt","type":"integer"},{"path":"_numUpdt","type":"integer"}]
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 504 : SmartStore.querySoup: 'smUpdates_a00i0000005SH72AAG' indexPath: _recordId
D/CordovaLog( 2150): file:///android_asset/app/components-min/angular/angular.js: Line 5754 : Error: Error calling method on NPObject.
D/CordovaLog( 2150): at androidExec (file:///android_asset/app/scripts/vendor/cordova.js:863:48)
D/CordovaLog( 2150): at file:///android_asset/app/scripts/vendor/cordova.force.js:196:16
D/CordovaLog( 2150): at Object.querySoup (file:///android_asset/app/scripts/vendor/cordova.force.js:505:9)
D/CordovaLog( 2150): at Object.query (file:///android_asset/app/scripts/services/services.js:1799:22)
D/CordovaLog( 2150): at file:///android_asset/app/scripts/services/services.js:813:24
D/CordovaLog( 2150): at file:///android_asset/app/components-min/angular/angular.js:6846:59
D/CordovaLog( 2150): at file:///android_asset/app/components-min/angular/angular.js:6883:26
D/CordovaLog( 2150): at Object.$eval (file:///android_asset/app/components-min/angular/angular.js:8057:28)
D/CordovaLog( 2150): at Object.$digest (file:///android_asset/app/components-min/angular/angular.js:7922:25)
D/CordovaLog( 2150): at Object.$apply (file:///android_asset/app/components-min/angular/angular.js:8143:24)
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 479 : SmartStore.registerSoup: 'Contacts' indexSpecs: [{"path":"Id","type":"string"},{"path":"Birthdate","type":"string"},{"path":"Email","type":"string"},{"path":"Name","type":"string"}]
D/CordovaLog( 2150): file:///android_asset/app/scripts/vendor/cordova.force.js: Line 504 : SmartStore.querySoup: 'Contacts' indexPath: Id
D/CordovaLog( 2150): file:///android_asset/app/components-min/angular/angular.js: Line 5754 : Error: Error calling method on NPObject.
D/CordovaLog( 2150): at androidExec (file:///android_asset/app/scripts/vendor/cordova.js:863:48)
D/CordovaLog( 2150): at file:///android_asset/app/scripts/vendor/cordova.force.js:196:16
D/CordovaLog( 2150): at Object.querySoup (file:///android_asset/app/scripts/vendor/cordova.force.js:505:9)
D/CordovaLog( 2150): at Object.query (file:///android_asset/app/scripts/services/services.js:1799:22)
D/CordovaLog( 2150): at file:///android_asset/app/scripts/controllers/controllers.js:1858:28
D/CordovaLog( 2150): at file:///android_asset/app/scripts/controllers/controllers.js:1862:13
D/CordovaLog( 2150): at file:///android_asset/app/components-min/angular/angular.js:6846:59
D/CordovaLog( 2150): at file:///android_asset/app/components-min/angular/angular.js:6883:26
D/CordovaLog( 2150): at Object.$eval (file:///android_asset/app/components-min/angular/angular.js:8057:28)
D/CordovaLog( 2150): at Object.$digest (file:///android_asset/app/components-min/angular/angular.js:7922:25)

 

 

This weekend I upgraded from SDK 1.5.3 to 2.0. My Android hybrid app extends SalesforceDroidGapActivity (mostly to do some initialization for a custom Cordova plugin used in the app). The AndroidManifest.xml mentions my activity as the main activity instead of SalesforceDroidGapActivity.

 

In my app I allow customers to do an oAuth logout so they can switch orgs if necessary. In SDK 1.5.3 this was working just fine. In SDK 2.0 I am seeing exceptions (see stacktrace below for details) and the app crashes. However, if I mention SalesforceDroidGapActivity in AndroidManifest.xml instead of my derived class, oAuth Logout works just fine, and the login page comes up just fine. Of course, consequently my plugin no longer works so I need to get some resolution here.

 

Is deriving a subclass from SalesforceDroidGapActivity in SDK 2.0 still supported, and if yes, is there anything I need to add to the derived class to allow oAuth Logout? Note that logout reported success, the problem apparently occurs somewhere on the way to the login page.

 

Thanks

Peter

 

I/ActivityManager( 1209): START u0 {flg=0x10000000 cmp=com.betsydog.attachhub/com.salesforce.androidsdk.ui.sfhybrid.Sale
sforceDroidGapActivity} from pid 4776
D/AndroidRuntime( 4776): Shutting down VM
W/dalvikvm( 4776): threadid=1: thread exiting with uncaught exception (group=0xb4d43908)
D/dalvikvm( 4795): GC_CONCURRENT freed 283K, 15% free 2448K/2848K, paused 6ms+0ms, total 8ms
E/AndroidRuntime( 4776): FATAL EXCEPTION: main
E/AndroidRuntime( 4776): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.betsydog
.attachhub/com.salesforce.androidsdk.ui.sfhybrid.SalesforceDroidGapActivity}; have you declared this activity in your An
droidManifest.xml?
E/AndroidRuntime( 4776): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1618)
E/AndroidRuntime( 4776): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
E/AndroidRuntime( 4776): at android.app.ContextImpl.startActivity(ContextImpl.java:949)
E/AndroidRuntime( 4776): at android.app.ContextImpl.startActivity(ContextImpl.java:931)
E/AndroidRuntime( 4776): at android.content.ContextWrapper.startActivity(ContextWrapper.java:284)
E/AndroidRuntime( 4776): at com.salesforce.androidsdk.app.SalesforceSDKManager.startLoginPage(SalesforceSDKManage
r.java:484)
E/AndroidRuntime( 4776): at com.salesforce.androidsdk.app.SalesforceSDKManager$1.run(SalesforceSDKManager.java:53
5)
E/AndroidRuntime( 4776): at android.accounts.AccountManager$Future2Task$1.run(AccountManager.java:1556)
E/AndroidRuntime( 4776): at android.os.Handler.handleCallback(Handler.java:725)
E/AndroidRuntime( 4776): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 4776): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 4776): at android.app.ActivityThread.main(ActivityThread.java:5039)
E/AndroidRuntime( 4776): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 4776): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 4776): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime( 4776): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)