使用html5(提醒应用)访问电话警报(本机资源)

时间:2014-02-17 10:13:08

标签: android html5 cordova phonegap-plugins

这些是我的技术,

  1. HTML5
  2. Jquery mobile,Jquery,Java Script
  3. 的CSS
  4. 科尔多瓦
  5. 我们正在使用HTML 5开发应用程序,我们需要访问手机(Android,iPhone,Windows Phone)资源,例如闹钟(创建提醒)。 问题,

    1. 我们可以通过这些技术访问手机的原生资源吗?
    2. 我们是否需要不同的编码来访问不同的移动操作系统?
    3. 这种方法的优点和缺点是什么?
    4. 这样做的最佳方法是什么?
    5. 有什么建议吗?
    6. 通过javascript访问Android,Iphone和Windows phone 8警报管理器的示例代码或示例?


      是否有人使用此Background Service Plugin执行此任务?


      我问过这个use for access alarm manager的问题
      任何人都有示例代码或给我一步一步的指导,如何使用它来访问Android报警管理器?


      我尝试通过像this question and answer这样的java脚本访问本机代码,但它无效。

      当我点击按钮时;

      1. 在eclipse logcat中;在cordova标签下,
      2. 未捕获TypeError:对象[object Object]没有方法'getTelephoneNumber'

        1. 在eclipse logcat中;在铬标签下,
        2. [INDO:CONSOLE(22)]“Uncaught TypeError:Object [object Object]没有方法'getTelephoneNumber'”,来源:file:///android_asset/www/index.html(22)

          我的phonegap版本是2.7.0,而模拟器API等级是19.这里有什么问题?我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

经过长时间的运行后,我设法找到Android设备的解决方案 1)使用javascript is possible访问本机代码 2)使用javascript界面​​引发xss漏洞的威胁,但在最新的API级别19中消除了这一点。 (阅读更多......)
让代码说话; 首先是MainActivity代码

@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" })
public class MainActivity extends DroidGap

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

2)要完成下一步,您需要在MainActivity类中使用Reminder类,以及您的assets文件夹中的html文件。就我而言,我在 assets / www / Phone / Login.html

中有 Login.html
webView.addJavascriptInterface(new Reminder(this), "Reminder");     
    webView.setWebChromeClient(new WebChromeClient());      
    webView.loadUrl("file:///android_asset/www/Phone/Login.html");          
    setContentView(webView);

3)这是我的提醒类及其构造函数

    public class Reminder  {        
    private Context con;        
    public Reminder(Context con){
        this.con=con;
    }
   }

4) ReminderReceiver

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();
    // end of toast...

    // Show status bar notification
    NotificationManager mNotificationManager = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(receiverID, mBuilder.build());

}}

5)可以通过JavaScript调用并负责将Alarm对象添加到System Alarm Manager的方法。在提醒课程中

@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=>as 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);                    

            }

6)现在,您需要编辑Android Manifest.xml 设置权限,

<uses-permission android:name="android.permission.VIBRATE" />

并注册ReminderReceiver类,在标签中添加此行(不在任何其他标签内!),

<receiver android:name=".ReminderReceiver">
 </receiver>

7)最后在你的html文件中添加按钮,添加javascript函数,在按钮点击事件中调用它,并在函数内部调用 addReminder 方法

 function test() {            

         Reminder.addReminder(2014,3,4,12,30);

     }

希望这个答案有助于在通过Phonegap进行开发时尝试使用Android手机的原生功能

答案 1 :(得分:1)

数目:

1.我们可以通过这些技术访问手机的原生资源吗?

是的,您可以使用javascripts。

<强> 2。我们是否需要不同的编码来访问不同的移动操作系统?

是的,所有尺码都不合适。

第3。建议:

检查每个移动系统的文档。您将找到指南和示例。