经过长时间的运行过程,我设法想出针对 Android 设备的解决方案。
- 使用访问本机代码javascript是可能的
- 使用 javascript 接口会带来 xss 漏洞的威胁,但在最新的 API Level 19 中消除了这一点。
让代码说话;首先是MainActivity代码
@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })
public class MainActivity extends DroidGap
-
onCreate
方法代码
super.init();
WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
// Add these lines according to your requirements
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setSaveFormData(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
//webView.getSettings().setSupportMultipleWindows(true);
webView.getSettings().setSupportZoom(true);
webView.setWebViewClient(new WebViewClient());
webView.setClickable(true);
- 要完成下一步,您需要
Reminder
与你的班级MainActivity
类以及资产文件夹中的任何 html 文件。就我而言,我有Login.html
in assets/www/Phone/Login.html
webView.addJavascriptInterface(new Reminder(this), "Reminder");
webView.setWebChromeClient(new WebChromeClient());
webView.loadUrl("file:///android_asset/www/Phone/Login.html");
setContentView(webView);
- 这是我的
Reminder
类及其构造函数
public class Reminder {
private Context con;
public Reminder(Context con){
this.con=con;
}
}
-
ReminderReceiver
class
public class ReminderReceiver extends BroadcastReceiver {
// Vibrator object
public Vibrator vibrator;
long[] pattern = { 0L, 250L, 200L, 250L, 200L, 250L, 200L, 250L, 200L, 250L, 200L, 250L, 200L, 250L, 200L };
// Ringtone object
Uri ringT;
Ringtone ringTone;
@Override
public void onReceive(Context context, Intent intent) {
String remindText = intent.getStringExtra("text");
int receiverID = intent.getIntExtra("AlrmId", 0);
// Notification creation
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
.setSmallIcon(android.R.drawable.ic_popup_reminder)
.setContentTitle("Reminder").setContentText(remindText);
// Create vibrator pattern
vibrator = (Vibrator) context
.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(pattern, -1);// No repetition
// Notification tone creation and play
ringT = RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
ringTone = RingtoneManager.getRingtone(context, ringT);
ringTone.play();
// Create toast and show on center of the screen
Toast toast = Toast.makeText(context, remindText, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
// Show status bar notification
NotificationManager mNotificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(receiverID, mBuilder.build());
}
}
- 可以通过 JavaScript 调用的方法,负责将 Alarm 对象添加到系统警报管理器中。在提醒类中
@JavascriptInterface
public void addReminder(int mYear, int mMonth, int mDay, int mHour, int mMinute) {
Calendar c = Calendar.getInstance();
// set Reminder time and date into calendar object
c.set(Calendar.YEAR, mYear);
c.set(Calendar.MONTH, mMonth); // Don't use exact numeric value of the month, use one minus. Ex: April => 3
c.set(Calendar.DATE, mDay);
c.set(Calendar.HOUR_OF_DAY, mHour);
c.set(Calendar.MINUTE, mMinute);
c.set(Calendar.SECOND, 0);
// Unique Alarm ID creation
int alrmId = 0;
alrmId = Integer.parseInt(mMonth + "" + mDay + "" + mHour + "" + mMinute);
// Alarm task creation
Intent in = new Intent(con, ReminderReceiver.class);
in.putExtra("text", "You have a Reminder!");
in.putExtra("AlrmId", alrmId);
PendingIntent pi;
pi = PendingIntent.getBroadcast(con, alrmId, in, 0);
AlarmManager am;
am = (AlarmManager) (con.getSystemService(Context.ALARM_SERVICE));
am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
}
-
现在,您需要编辑您的Android Manifest.xml
,
- 设置权限
<uses-permission android:name="android.permission.VIBRATE" />
and
- 登记
ReminderReceiver
类中,添加此行<application> </application>
tag <receiver android:name=".ReminderReceiver"></receiver>
.
-
最后在你的html文件中添加按钮,添加javascript函数,在按钮单击事件和该函数调用内部调用它addReminder
method
function test() {
Reminder.addReminder(2014, 3, 4, 12, 30);
}
希望这个答案能够帮助那些尝试通过 Phonegap 进行开发时使用 Android 手机的 Native 功能的人。