JavaScript接口在我的Android应用程序中不起作用
以下是我的MainActivity类代码JavaScript接口在我的Android应用程序中不起作用,javascript,android,html,android-webview,local-storage,Javascript,Android,Html,Android Webview,Local Storage,以下是我的MainActivity类代码 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); WebView webView = new WebView
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
WebView webView = new WebView(this);
//add the JavaScriptInterface so that JavaScript is able to use LocalStorageJavaScriptInterface's methods when calling "LocalStorage"
webView.addJavascriptInterface(new LocalStorageJavaScriptInterface(this), "LocalStorage");
WebSettings settings = webView.getSettings();
// TO enable JS
settings.setJavaScriptEnabled(true);
// To enable Localstorage
settings.setDomStorageEnabled(true);
//those two lines seem necessary to keep data that were stored even if the app was killed.
settings.setDatabaseEnabled(true);
/*
webView.setWebChromeClient(new WebChromeClient() {
public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
quotaUpdater.updateQuota(5 * 1024 * 1024);
}
});*/
//load HTML File in webview
webView.loadUrl("file:///android_asset/main.html");
setContentView(webView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* This class is used as a substitution of the local storage in Android webviews
*
* @author Diane
*/
public class LocalStorageJavaScriptInterface {
private Context mContext;
private LocalStorage localStorageDBHelper;
private SQLiteDatabase database;
LocalStorageJavaScriptInterface(Context c) {
mContext = c;
localStorageDBHelper = LocalStorage.getInstance(mContext);
}
/**
* This method allows to get an item for the given key
* @param key : the key to look for in the local storage
* @return the item having the given key
*/
@JavascriptInterface
public String getItem(String key)
{
String value = null;
if(key != null)
{
database = localStorageDBHelper.getReadableDatabase();
Cursor cursor = database.query(LocalStorage.LOCALSTORAGE_TABLE_NAME,
null,
LocalStorage.LOCALSTORAGE_ID + " = ?",
new String [] {key},null, null, null);
if(cursor.moveToFirst())
{
value = cursor.getString(1);
}
cursor.close();
database.close();
}
return value;
}
/**
* set the value for the given key, or create the set of datas if the key does not exist already.
* @param key
* @param value
*/
@JavascriptInterface
public void setItem(String key,String value)
{
if(key != null && value != null)
{
String oldValue = getItem(key);
database = localStorageDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(LocalStorage.LOCALSTORAGE_ID, key);
values.put(LocalStorage.LOCALSTORAGE_VALUE, value);
if(oldValue != null)
{
database.update(LocalStorage.LOCALSTORAGE_TABLE_NAME, values, LocalStorage.LOCALSTORAGE_ID + " = " + key, null);
}
else
{
database.insert(LocalStorage.LOCALSTORAGE_TABLE_NAME, null, values);
}
database.close();
}
}
/**
* removes the item corresponding to the given key
* @param key
*/
@JavascriptInterface
public void removeItem(String key)
{
if(key != null)
{
database = localStorageDBHelper.getWritableDatabase();
database.delete(LocalStorage.LOCALSTORAGE_TABLE_NAME, LocalStorage.LOCALSTORAGE_ID + " = " + key, null);
database.close();
}
}
/**
* clears all the local storage.
*/
@JavascriptInterface
public void clear()
{
database = localStorageDBHelper.getWritableDatabase();
database.delete(LocalStorage.LOCALSTORAGE_TABLE_NAME, null, null);
database.close();
}
}
}
基本上我使用的是AndroidLocalstorage插件,它基本上被用作本地存储的后备选项
以下是我的AndroidMainifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android_playlist"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.android_playlist.MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
但是当我检查浏览器控制台时,我总是得到catch中的console.log
有人能解释一下我的代码有什么问题,为什么Javascript界面不适合我。
下面是我在控制台中遇到的错误
{stack: (...), message: "LocalStorage is not defined"}
我忘了提到的一件重要的事情是,我正在笔记本电脑浏览器上测试这一点,只需使用file:protocol加载HTML文件。
这有关系吗
window.localStorage=LocalStorage;
上面的代码表示窗口对象具有名为
localStorage
的属性,您正在尝试将其值设置为localStorage
LocalStorage
由android为您创建的对象,该对象可以得到保证,但最终窗口对象的LocalStorage
属性没有保证。因此引发异常。希望这对你有帮助 我终于在我的代码中发现了问题,在AndroidMainifest XML中,我的targetSDK版本是18。
它应该是19,因为我没有在MainActivity中设置数据库路径和数据库大小
原始代码
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="18" />
更改代码
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
您是否建议Windows没有名为localStorage的属性?即使在这项更改之前,我也在使用本地存储。。。。所以我很困惑我在我的三星note Android 4.1.2上测试了这段代码,我在localStorage中添加了一些项目并重新启动了手机,localStorage数据被删除:(有人能在这里帮助我吗?首先设置javascript启用标志,然后将javascript接口添加到webview。@ShantanooK window.localStorage=localStorage u不能这样做。window object中没有名为localStorage的属性。那么我该怎么办呢?访问window.localStorage时我也没有遇到任何问题,而是出现了异常。)未定义该本地存储
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />