6

押すと、webviewでtwitterログインページを開くボタンがあります(アクティビティとして)。私はtwitter4j バージョン 2.2.6を使用しています。問題はこれです - エミュレーターまたはサムスン glaxy 2 をクリックすると、バグがなくても完全に動作しますが、サムスン ギャラクシー 3 GT-I9300 (および友人の同じ電話) のボタンをクリックすると、次の例外が発生します。

android.database.sqlite.SQLiteException: no such table: password: 、コンパイル中: SELECT username, password FROM password WHERE (host == ?) at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) at android.database. sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:68) android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143) android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361) android.database. sqlite.SQLiteProgram.(SQLiteProgram.java:127) android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:94) android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:53) android.database.sqlite. android.database の SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)。sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1684) android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1569) android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525) android.database .sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605) で android.webkit.WebViewDatabase.getUsernamePassword(WebViewDatabase.java:990) で android.webkit.BrowserFrame.handleMessage(BrowserFrame.java:589) で android.os.Handler. android.os.Looper.loop(Looper.java:137) の dispatchMessage(Handler.java:99) android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:950) の java.lang.Thread.run(Thread .java:856)SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1569) で android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525) で android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605) で android.webkit.WebViewDatabase android.os.Handler.dispatchMessage(Handler.java:99) で android.os.Looper.loop(Looper. java:137) android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:950) で java.lang.Thread.run(Thread.java:856) でSQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1569) で android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1525) で android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1605) で android.webkit.WebViewDatabase android.os.Handler.dispatchMessage(Handler.java:99) で android.os.Looper.loop(Looper. java:137) android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:950) で java.lang.Thread.run(Thread.java:856) で1605) android.webkit.WebViewDatabase.getUsernamePassword(WebViewDatabase.java:990) で android.webkit.BrowserFrame.handleMessage(BrowserFrame.java:589) で android.os.Handler.dispatchMessage(Handler.java:99) で android. os.Looper.loop(Looper.java:137) at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:950) at java.lang.Thread.run(Thread.java:856)1605) android.webkit.WebViewDatabase.getUsernamePassword(WebViewDatabase.java:990) で android.webkit.BrowserFrame.handleMessage(BrowserFrame.java:589) で android.os.Handler.dispatchMessage(Handler.java:99) で android. os.Looper.loop(Looper.java:137) at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:950) at java.lang.Thread.run(Thread.java:856)

webview はアクティビティです (Activity を拡張します)。クラッシュの時点で十分な空き容量があります。

合計 - 12187213824 無料 - 4315947008

クラッシュ時の私の構成:

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

デバイスの機能:

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

環境:

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

権限:

<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"/>

Webviewでは、sqlliteトランザクションを作成したり、何も関与したりしませんでした。

この行に関する私の回答を参照してください

私はrootユーザーではありません (書き込み権限があることを意味します)

webview を含むコードは次のとおりです。

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); 
    } 

いくつかの類似点があるこのリンクを見つけました:

長い一週間、あまりにも多くのスレッドを見てきましたが、かなりイライラしています

誰かアイデアはありますか?ありがとう

4

2 に答える 2

1

結局のところ、コードのどこかにこの2行がありました。

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

この行は私のWebビューのキャッシュをクリアすることになっていますが、この行は以前のデバイスでのみ機能しました。ギャラクシー3や他のデバイスでは、開始されたときにWebビューがこのデータベースを再度作成しないため、sqliteの例外が発生しました。本当にテーブルがありませんでした...

注意する必要があります-私が書いた行は誤解を招くものでした:

「Webビューでは、sqlliteトランザクションを実行しなかったか、何も関与していませんでした」

于 2012-10-24T08:13:55.527 に答える
0

このクラッシュは再現が困難ですが、まったく同じ例外が発生し (「そのようなテーブルはありません: パスワード」と言及していても)、アクティビティに移動してから 2 番目のアクティビティに移動し、WebView を次のフォーム要素を含む HTML を表示するダイアログ:

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

そのフォーム要素からそれを削除type="password"すると、クラッシュが防止されました。

WebView は、後で使用するためにパスワードを sqlite db に保存しようとします。確かなことは言えませんが、これはほとんどの開発者にとって望ましい動作ではないと思うので、必要に応じて、WebView の WebSettings インスタンスで次のように呼び出して、この機能をオフにすることができます。

myWebView.getSettings().setSavePassword(false);

この回答は、この問題にも光を当てる可能性があります: WebView でのメモリ リーク

彼らは、これに対する別の解決策を指摘しています。

webView = new WebView(getApplicationContext());
于 2013-01-16T21:28:43.627 に答える