2012-10-22 15 views
6

Mam przycisk, który po naciśnięciu otwiera stronę logowania na twitter w widoku webowym (jako działanie). używam twitter4j wersja 2.2.6. Problem polega na tym, że kiedy klikam emulator lub mój samsung glaxy 2 działa idealnie bez żadnych błędów, ale kiedy klikam przycisk na moim samsung galaxy 3 GT-I9300 (i moi znajomi ten sam telefon) otrzymuję następujący wyjątek:Dziwny SQLiteException nie na wszystkich urządzeniach

android.database.sqlite.SQLiteException: nie takie tabeli: hasło:, podczas kompilacji: (? gospodarzem ==) Wybrać nazwę użytkownika, hasło z hasłem GDZIE na android.database.sqlite. SQLiteCompiledSql.native_compile (Metoda rodzima ) na android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:68) at android.dat abase.sqlite.SQLiteProgram.compileSql (SQLiteProgram.java:143) w android.database.sqlite.SQLiteProgram.compileAndbindAllArgs (SQLiteProgram.java:361) w android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:127) na android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:94) na android.database.sqlite.SQLiteQuery. (SQLiteQuery.java:53) na android.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver.java:47) w android.database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java:1684) w android.database.sqlite.SQLiteDatabase.queryWithFactory (SQLiteDatabase.java:1569) w android.database.sqlite.SQLiteDatabase.query (SQLiteDatabase .java: 1525) na android.dat abase.sqlite.SQLiteDatabase.query (SQLiteDatabase.java:1605) w android.webkit.WebViewDatabase.getUsernamePassword (WebViewDatabase.java:990) w android.webkit.BrowserFrame.handleMessage (BrowserFrame.java:589) w android. os.Handler.dispatchMessage (Handler.java:99) na android.os.Looper.loop (Looper.java:137) na android.webkit.WebViewCore $ WebCoreThread.run (WebViewCore.java:950) w java. lang.Thread.run (Thread.java:856)

WebView jest aktywność (wydłuża) aktywność mam dużo wolnego miejsca w punkcie zderzenia:

całkowitego cholesterolu 12187213824 Free-4315947008

moja konfiguracja w katastrofie:

FlipFont=0 
compatScreenHeightDp=546 
compatScreenWidthDp=320 
compatSmallestScreenWidthDp=320 
fontScale=0.93 
hardKeyboardHidden=HARDKEYBOARDHIDDEN_YES 
keyboard=KEYBOARD_NOKEYS 
keyboardHidden=KEYBOARDHIDDEN_NO 
locale=en_US 
mcc=425 
mnc=1 
navigation=NAVIGATION_NONAV 
navigationHidden=NAVIGATIONHIDDEN_YES 
orientation=ORIENTATION_PORTRAIT 
screenHeightDp=615 
screenLayout=SCREENLAYOUT_SIZE_NORMAL+SCREENLAYOUT_LONG_YES 
screenWidthDp=360 
seq=46 
smallestScreenWidthDp=360 
textLayoutDirection=0 
touchscreen=TOUCHSCREEN_FINGER 
uiMode=UI_MODE_TYPE_NORMAL+UI_MODE_NIGHT_NO 
userSetLocale=false 

funkcje urządzenia:

android.hardware.wifi 
android.hardware.location.network 
android.hardware.nfc 
android.hardware.location 
android.hardware.sensor.gyroscope 
android.hardware.screen.landscape 
android.hardware.screen.portrait 
android.hardware.wifi.direct 
android.hardware.usb.accessory 
android.hardware.bluetooth 
android.hardware.touchscreen.multitouch.distinct 
android.hardware.microphone 
android.hardware.sensor.light 
android.hardware.camera.autofocus 
android.software.live_wallpaper 
android.hardware.camera.flash 
android.hardware.telephony 
android.software.sip 
android.hardware.touchscreen.multitouch.jazzhand 
android.hardware.sensor.barometer 
android.hardware.usb.host 
android.hardware.touchscreen.multitouch 
android.hardware.sensor.compass 
android.hardware.faketouch 
android.hardware.camera 
com.sec.feature.minimode 
android.software.sip.voip 
android.hardware.sensor.proximity 
android.hardware.location.gps 
android.hardware.telephony.gsm 
android.hardware.camera.front 
com.nxp.mifare 
android.hardware.touchscreen 
android.hardware.sensor.accelerometer 
glEsVersion = 2.0 

ŚRODOWISKO:

getAndroidSecureContainerDirectory=/mnt/asec 
getCloudStorageDirectory=/mnt/sdcard/cloud 
getCloudStorageDirectoryPath=/mnt/sdcard/cloud 
getDataDirectory=/data 
getDownloadCacheDirectory=/cache 
getExternalStorageAndroidDataDir=/mnt/sdcard/Android/data 
getExternalStorageDirectory=/mnt/sdcard 
getExternalStorageDirectoryUsbHost=/mnt/sdcard/Storages/usb 
getExternalStorageState=mounted 
getRootDirectory=/system 
getSecureDataDirectory=/data 
getSystemSecureDirectory=/data/system 
isEncryptedFilesystemEnabled=false 
isExternalStorageEmulated=true 
isExternalStorageRemovable=false 

Uprawnienia:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.GET_TASKS"/> 

W WebView nie zrobił wykonane dowolną sqllite transakcji lub nic zaangażowany.

zobacz moją odpowiedź na temat tej linii

Nie jestem korzeń użytkownik (czyli mam prawa zapisu)

kod udziałem webview jest:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    try{ 
        requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.twitter); 
     mIntent = getIntent(); 
     String url = (String)mIntent.getExtras().get("URL"); 
     WebView webView = (WebView) findViewById(R.id.webview); 

     WebSettings settings = webView.getSettings(); 

     settings.setDatabaseEnabled(true); 
     settings.setDatabasePath("/data/data/"+getPackageName()+"/databases"); 
     settings.setDomStorageEnabled(true); 

     settings.setJavaScriptEnabled(true); 
     settings.setAllowFileAccess(true); 
     settings.setSaveFormData(true); 
     settings.setSavePassword(true); 
      webView.setWebViewClient(new WebViewClient() 
      { 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) 
       { 
        ... 
        return false; 
       } 
      }); 
      webView.loadUrl(url); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 


    } 
    public void onExceededDatabaseQuota(String url, String 
      databaseIdentifier, long currentQuota, long estimatedSize, long 
      totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 

     quotaUpdater.updateQuota(204801); 
    } 

Znalazłem te linki, które mają pewne podobieństwo:

Szukałem na zbyt wiele wątków na długi tydzień i jestem bardzo sfrustrowany to

czy ktoś ma jakieś pomysły? Dzięki

Odpowiedz

1

jak się okazuje Miałam dwie linie gdzieś w kodzie:

context.deleteDatabase("webview.db"); 
context.deleteDatabase("webviewCache.db"); 

tej linii gdzie powinien wyczyścić cache dla mojego WebView, ale to kwestia tylko pracował na poprzednich urządzeń, w galaxy 3 i być może inne urządzenia, jak się okazuje, po uruchomieniu webview nie tworzy ponownie tych baz danych, więc wyjątek sqlite był, ponieważ tak naprawdę nie miał tabeli ...

trzeba być ostrożnym z tym - wiersz, który napisałem, był mylący:

„W WebView i nie popełnił żadnego sqllite transakcję zaangażowany albo nic”

+0

mam dokładnie ten sam problem bez użycia dla sqllite też, ale ja nie zrobić coś specjalnego z cach mi!! i nie wiem, czego szukać teraz! – AbdelHady

0

Ta katastrofa jest trudne do odtworzenia, ale byłem coraz dokładnie ten sam wyjątek (nawet wspomnieć „Taki stół: hasło”) i mogę odtworzyć go, przechodząc do aktywności, a następnie do 2 działalności, a następnie otwierając WebView w oknie, wyświetlanie HTML zawierający następujący element forma:

<input type="password" name="pword" id="pword"> 

Usuwanie że type="password" od tego elementu formularza zapobiegać to od awarii.

WebView podejmuje próbę zapisania haseł do późniejszego wykorzystania w bazie danych sqlite db.Nie mogę powiedzieć na pewno, ale wyobrażam sobie, nie jest to pożądane zachowanie dla większości programistów, więc jeśli chcesz, możesz wyłączyć tę funkcję, wywołując następujące operacje na Webview na przykład WebSettings:

myWebView.getSettings().setSavePassword(false); 

Ta odpowiedź może też świecić trochę światła na ten problem: Memory leak in WebView

Zwracają uwagę innego rozwiązania do tego, który jest:

webView = new WebView(getApplicationContext()); 
Powiązane problemy