2011-08-29 37 views
6

Tôi mới sử dụng Android và Java. Tôi đã xây dựng một ứng dụng bằng HTML/Javascript đang hoạt động tốt.Android - Cách chạy ý định từ JavaScript

Bây giờ tôi cần tạo một hoạt động khởi chạy ứng dụng email, điền vào chủ đề và nội dung, và (phần khó khăn) thêm tệp đính kèm. Tôi không thể thực hiện việc này từ bên trong JavaScript, mailto: sẽ không đính kèm tệp.

Vì vậy, tôi cần thực hiện điều này thông qua Java và thực thi nó từ JavaScript. Tôi nghĩ rằng điều này có thể được thực hiện bằng cách sử dụng addJavaScriptInterface nhưng tôi không thể tìm thấy bất kỳ tài liệu hoặc ví dụ chi tiết nào để tắt.

Tôi làm cách nào để thực hiện việc này?

Dưới đây là những gì tôi có cho đến nay sau khi đọc tài liệu:

2nd cập nhật mã:

MainActivity.java

public class MainActivity extends DroidGap { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.setIntegerProperty("splashscreen", R.drawable.splash); 
    super.loadUrl("file:///android_asset/www/index.html", 1000); 
    WebView mWebView; 
    mWebView = (WebView)findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.addJavascriptInterface(new JavaScriptInterface(), "Android"); 
} 
} 

JavaScriptInterface.java

public class JavaScriptInterface { 

public void doEmail(){ 
    Intent sendIntent = new Intent(Intent.ACTION_SEND); 
    sendIntent.setType("text/html"); 
    sendIntent.putExtra(android.content.Intent.EXTRA_TEXT,"test text"); 
    sendIntent.putExtra(Intent.EXTRA_SUBJECT,"test subject"); 
    sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    sendIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://test co.html")); 
    startActivity(Intent.createChooser(sendIntent, "Send email...")); 
    } 
} 

Sau đó, Tôi sẽ tham khảo ý định thông qua JavaScript bằng cách sử dụng Android.doEmail() .

Với đoạn mã trên tôi nhận được 2 lỗi trong Eclipse 1. Phương pháp startActivity (Ý định) là undefined cho các loại - JavaScriptInterface 2. webview không thể được giải quyết hay không là một lĩnh vực - MainActivity

gì tôi đang làm sai à?

Trả lời

4
public class MainActivity extends DroidGap { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.setIntegerProperty("splashscreen", R.drawable.splash); 

     JavaScriptInterface jsi = new JavaScriptInterface(this, appView); 
     appView.addJavascriptInterface(jsi, "Android"); 

     super.loadUrl("file:///android_asset/www/index.html", 1000); 
    } 
} 

public class JavaScriptInterface { 
    private WebView mAppView; 
    private DroidGap mGap 

    public JavaScriptInterface (DroidGap gap, WebView view) 
    { 
     mAppView = view; 
     mGap = gap; 
    } 

    public void doEmail(){ 
     Intent sendIntent = new Intent(Intent.ACTION_SEND); 
     sendIntent.setType("text/html"); 
     sendIntent.putExtra(android.content.Intent.EXTRA_TEXT,"test text"); 
     sendIntent.putExtra(Intent.EXTRA_SUBJECT,"test subject"); 
     sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     sendIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file://test co.html")); 
     startActivity(Intent.createChooser(sendIntent, "Send email...")); 
    } 
} 
+0

Tôi đã có 'MainActivity'. Tôi có bao gồm những thứ khác ở đây không? 'public class MainActivity mở rộng DroidGap {/ ** Được gọi khi hoạt động được tạo lần đầu tiên. */@Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); super.setIntegerProperty ("splashscreen", R.drawable.splash); super.loadUrl ("tệp: ///android_asset/www/index.html", 1000); }} ' – user899641

+0

Xin lỗi, tôi không biết cách làm cho mã gọn gàng như trên ... – user899641

+0

http://stackoverflow.com/questions/2727763/communication-between-android-java-and-phonegap-javascript – adamcodes

2

Sử dụng addJavaScriptInterface sẽ mở rộng DOM bên trong trình duyệt được nhúng và cho phép JS truy cập đối tượng Java, chính xác là những gì bạn muốn.

Có quá nhiều bước để phác thảo ở đây, đã được ghi lại. link này có tổng quan tốt.

+0

Tôi đã chỉnh sửa câu hỏi của mình và bao gồm những gì tôi có cho đến nay. Bạn có thể cho tôi biết tôi đang làm gì sai không? – user899641

6

This documentation cho bạn biết chính xác cách thực hiện.

Dường như có ba bước chính:

  1. Tạo lớp 'giao diện' của bạn trong Android
  2. Thêm một thể hiện của 'giao diện' này đến WebView bạn đang sử dụng.
  3. Gọi giao diện từ JavaScript của bạn.
+0

Ok, tôi đã chỉnh sửa câu hỏi của mình và bao gồm những gì tôi có cho đến nay. Bạn có thể cho tôi biết tôi đang làm gì sai không? – user899641

+0

Lớp 'JavaScriptInterface' của bạn không được mở rộng' Hoạt động'. Nó sẽ là lớp riêng của nó có phương thức 'send()'. Lớp 'Activity' của bạn nên thực hiện phần thứ hai của phương thức' send() 'mã của bạn (phần' WebView') –

+0

@ nicholas.hauschild i'am theo cùng một tài liệu nhưng thông báo bánh mì nướng không có lý do tại sao. – NagarjunaReddy

0

tôi đã sử dụng WebIntent từ Boris bộ cấp nguồn (http://smus.com/android-phonegap-plugins) và nó hoạt động như một nét duyên dáng. Bạn cũng có thể nghiên cứu mã của mình một chút để hiểu rõ hơn cách tiếp cận mà anh ta đã thực hiện với các plugin.

LƯU Ý: bạn cần cập nhật mã được cung cấp dưới dạng một chút (xem nhận xét) và kiến ​​trúc plugin đã thay đổi một chút.

Các vấn đề liên quan