2015-05-21 13 views
12

Tôi không thể triển khai chức năng liên kết mailto trong chế độ xem web tùy chỉnh được đưa ra bên dưới. Xin hãy giúp tôi trộn hai mã này Tôi tương đối mới với Android. Tôi không biết cách triển khai Mã mailto.Android Webview: Mailto Không thể triển khai

Giải pháp trên stackoverflow:

Mailto Mã

@Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) {  
     if(url.startsWith("mailto:")){ 
      MailTo mt = MailTo.parse(url); 
      Intent i = new Intent(Intent.ACTION_SEND); 
      i.setType("text/plain"); 
      i.putExtra(Intent.EXTRA_EMAIL, new String[]{mt.getTo()}); 
      i.putExtra(Intent.EXTRA_SUBJECT, mt.getSubject()); 
      i.putExtra(Intent.EXTRA_CC, mt.getCc()); 
      i.putExtra(Intent.EXTRA_TEXT, mt.getBody()); 
      mContext.startActivity(i); 
      view.reload(); 
      return true; 
     } 
     view.loadUrl(url); 
     return true; 
    } 

Mã của tôi

public class MainActivity extends Activity implements OnClickListener { 

    final Context context = this; 
private WebView webView; 
private ImageButton btnrefresh;  
private TextView txtrefresh; 
private Menu optionsMenu; 



@SuppressWarnings("deprecation") 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    //define button 
    btnrefresh = (ImageButton) findViewById(R.id.imageButton1); 

    btnrefresh.setOnClickListener(this); 
    btnrefresh.setVisibility(View.GONE); 

    //define textView 
    txtrefresh = (TextView)findViewById((R.id.textView1)); 
    txtrefresh.setVisibility(View.GONE); 


    if(isConnected()) 
    { 

     webView = (WebView) findViewById(R.id.webView1); 
     webView.getSettings().setJavaScriptEnabled(true);  
    // webView.getSettings().setPluginState(PluginState.ON); 
     webView.setWebViewClient(new WebViewClient()); 
     initWebView(webView);       
     webView.loadUrl("xxxxx");    

     } 


    else 
    { 

    RelativeLayout rel = (RelativeLayout)findViewById(R.id.relativelayout1); 
    rel.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
     refresh(); 
     } 
    }); 
     btnrefresh.setVisibility(View.VISIBLE); 
     txtrefresh.setVisibility(View.VISIBLE); 
     Toast.makeText(getBaseContext(), "No Internet Connection !!", Toast.LENGTH_SHORT).show(); 


    }  
} 

public boolean onCreateOptionsMenu(Menu menu) { 
    this.optionsMenu = menu; 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_activity_actions, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.airport_menuRefresh: 
     webView.reload(); 
     Toast.makeText(getBaseContext(), "Refeshing...", Toast.LENGTH_SHORT).show(); 
     // Complete with your code 
    return true; 

    case R.id.goBack: 
    if(webView.canGoBack()) { 
     webView.goBack(); 
    } 
    return true; 

    case R.id.goForward: 
    if(webView.canGoForward()) { 
     webView.goForward(); 
    } 
    return true; 
    default: 
    return super.onOptionsItemSelected(item); 
    } 
} 



public void refresh() 
{ 
    if (isConnected()) { 
    btnrefresh.setVisibility(View.GONE); 
    txtrefresh.setVisibility(View.GONE); 
    webView = (WebView) findViewById(R.id.webView1); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.setWebViewClient(new WebViewClient()); 
     initWebView(webView);  
    webView.loadUrl("xxxxxx");   


    Toast.makeText(getBaseContext(), "Connected !!", Toast.LENGTH_LONG).show(); 

    Toast.makeText(getBaseContext(), "Loading....", Toast.LENGTH_SHORT).show(); 
    Toast.makeText(getBaseContext(), "Please wait....", Toast.LENGTH_SHORT).show(); 
    } 
    else 
    { 
     Toast.makeText(getBaseContext(), "No Internet Connection !!", Toast.LENGTH_SHORT).show(); 
    }  
} 



public boolean isConnected(){ 
     ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Activity.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
      if (networkInfo != null && networkInfo.isConnected()) 
      { 
      return true; 
      } 
      else      
       return false;  
    } 


    public void wifi() 
    { 
     WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     wifi.setWifiEnabled(true); 
    } 

    public void alertwifi() 
    { 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); 

     // set title 
     alertDialogBuilder.setTitle("NO Internet Connection!!"); 

     // set dialog message 
     alertDialogBuilder 
      .setMessage("Click below to turn on Wifi or Enable Data pack") 
      .setCancelable(false) 
      .setPositiveButton("Wifi",new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,int id) { 
        // if this button is clicked, close 
        // current activity 
        wifi(); 
       } 
       }) 
       .setNeutralButton("GPRS",new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,int id) { 
        // if this button is clicked, close 
        // current activity 
        datapack(); 
       } 
       }) 
      .setNegativeButton("Back",new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,int id) { 
        // if this button is clicked, just close 
        // the dialog box and do nothing 

        dialog.cancel(); 


       } 
      }); 


      // create alert dialog 
      AlertDialog alertDialog = alertDialogBuilder.create(); 

      // show it 
      alertDialog.show(); 
     } 

    public void datapack() 
    { 
     try 
     { 
    ConnectivityManager dataManager; 
    dataManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class); 
    dataMtd.setAccessible(true); 
    dataMtd.invoke(dataManager, true); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 

     } 
    } 

    @Override 
     public boolean onKeyDown(int keyCode, KeyEvent event) { 
      if ((keyCode == KeyEvent.KEYCODE_BACK)) { 
       AlertDialog.Builder alertbox = new AlertDialog.Builder(MainActivity.this); 

       alertbox.setTitle("Do You Want To Exit ?"); 
       alertbox.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface arg0, int arg1) { 
         // finish used for destroyed activity 
         exit(); 
        } 
       }); 

       alertbox.setNegativeButton("No", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface arg0, int arg1) { 
          // Nothing will be happened when clicked on no button 
          // of Dialog  
       } 
       }); 

       alertbox.show(); 
      } 
      return super.onKeyDown(keyCode, event); 
     } 
    public void exit() 
    { 
     Intent intent = new Intent(Intent.ACTION_MAIN); 
     intent.addCategory(Intent.CATEGORY_HOME); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 


     public void onClick(View v) 

     { 


     //refresh ImageButton function 

      if (v == btnrefresh) 
      { 
       refresh(); 
      } 


      } 

     private final static Object methodInvoke(Object obj, String method, Class<?>[] parameterTypes, Object[] args) { 
      try { 
       Method m = obj.getClass().getMethod(method, new Class[] { boolean.class }); 
       m.invoke(obj, args); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 


     private void initWebView(WebView webView) { 

      WebSettings settings = webView.getSettings(); 

      settings.setJavaScriptEnabled(true); 
      settings.setAllowFileAccess(true); 
      settings.setDomStorageEnabled(true); 
      settings.setCacheMode(WebSettings.LOAD_NO_CACHE); 
      settings.setLoadWithOverviewMode(true); 
      settings.setUseWideViewPort(true); 
      settings.setSupportZoom(true); 
      // settings.setPluginsEnabled(true); 
      methodInvoke(settings, "setPluginsEnabled", new Class[] { boolean.class }, new Object[] { true }); 
      // settings.setPluginState(PluginState.ON); 
      methodInvoke(settings, "setPluginState", new Class[] { PluginState.class }, new Object[] { PluginState.ON }); 
      // settings.setPluginsEnabled(true); 
      methodInvoke(settings, "setPluginsEnabled", new Class[] { boolean.class }, new Object[] { true }); 
      // settings.setAllowUniversalAccessFromFileURLs(true); 
      methodInvoke(settings, "setAllowUniversalAccessFromFileURLs", new Class[] { boolean.class }, new Object[] { true }); 
      // settings.setAllowFileAccessFromFileURLs(true); 
      methodInvoke(settings, "setAllowFileAccessFromFileURLs", new Class[] { boolean.class }, new Object[] { true }); 

      webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
      webView.clearHistory(); 
      webView.clearFormData(); 
      webView.clearCache(true); 

      webView.setWebChromeClient(new MyWebChromeClient()); 
      // webView.setDownloadListener(downloadListener); 


     } 



     UploadHandler mUploadHandler; 

     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 

      if (requestCode == Controller.FILE_SELECTED) { 
       // Chose a file from the file picker. 
       if (mUploadHandler != null) { 
        mUploadHandler.onResult(resultCode, intent); 
       } 
      } 

      super.onActivityResult(requestCode, resultCode, intent); 
     } 

     @SuppressLint("NewApi") 
     class MyWebChromeClient extends WebChromeClient { 
      public MyWebChromeClient() { 

      } 


      @SuppressLint("NewApi") 
      private String getTitleFromUrl(String url) { 
       String title = url; 
       try { 
        URL urlObj = new URL(url); 
        String host = urlObj.getHost(); 
        if (host != null && !host.isEmpty()) { 
         return urlObj.getProtocol() + "://" + host; 
        } 
        if (url.startsWith("file:")) { 
         String fileName = urlObj.getFile(); 
         if (fileName != null && !fileName.isEmpty()) { 
          return fileName; 
         } 
        } 
       } catch (Exception e) { 
        // ignore 
       } 

       return title; 
      } 

      @Override 
      public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { 
       String newTitle = getTitleFromUrl(url); 

       new AlertDialog.Builder(MainActivity.this).setTitle(newTitle).setMessage(message).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         result.confirm(); 
        } 
       }).setCancelable(false).create().show(); 
       return true; 
       // return super.onJsAlert(view, url, message, result); 
      } 

      @Override 
      public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { 

       String newTitle = getTitleFromUrl(url); 

       new AlertDialog.Builder(MainActivity.this).setTitle(newTitle).setMessage(message).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         result.confirm(); 
        } 
       }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         result.cancel(); 
        } 
       }).setCancelable(false).create().show(); 
       return true; 

       // return super.onJsConfirm(view, url, message, result); 
      } 

      // Android 2.x 
      public void openFileChooser(ValueCallback<Uri> uploadMsg) { 
       openFileChooser(uploadMsg, ""); 
      } 

      // Android 3.0 
      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { 
       openFileChooser(uploadMsg, "", "filesystem"); 
      } 

      // Android 4.1 
      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { 
       mUploadHandler = new UploadHandler(new Controller()); 
       mUploadHandler.openFileChooser(uploadMsg, acceptType, capture); 
      } 
     }; 

     class Controller { 
      final static int FILE_SELECTED = 4; 

      Activity getActivity() { 
       return MainActivity.this; 
      } 
     } 


     class UploadHandler { 
      /* 
      * The Object used to inform the WebView of the file to upload. 
      */ 
      private ValueCallback<Uri> mUploadMessage; 
      private String mCameraFilePath; 
      private boolean mHandled; 
      private boolean mCaughtActivityNotFoundException; 
      private Controller mController; 
      public UploadHandler(Controller controller) { 
       mController = controller; 
      } 
      String getFilePath() { 
       return mCameraFilePath; 
      } 
      boolean handled() { 
       return mHandled; 
      } 
      void onResult(int resultCode, Intent intent) { 
       if (resultCode == Activity.RESULT_CANCELED && mCaughtActivityNotFoundException) { 
        // Couldn't resolve an activity, we are going to try again so skip 
        // this result. 
        mCaughtActivityNotFoundException = false; 
        return; 
       } 
       Uri result = intent == null || resultCode != Activity.RESULT_OK ? null 
         : intent.getData(); 
       // As we ask the camera to save the result of the user taking 
       // a picture, the camera application does not return anything other 
       // than RESULT_OK. So we need to check whether the file we expected 
       // was written to disk in the in the case that we 
       // did not get an intent returned but did get a RESULT_OK. If it was, 
       // we assume that this result has came back from the camera. 
       if (result == null && intent == null && resultCode == Activity.RESULT_OK) { 
        File cameraFile = new File(mCameraFilePath); 
        if (cameraFile.exists()) { 
         result = Uri.fromFile(cameraFile); 
         // Broadcast to the media scanner that we have a new photo 
         // so it will be added into the gallery for the user. 
         mController.getActivity().sendBroadcast(
           new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result)); 
        } 
       } 
       mUploadMessage.onReceiveValue(result); 
       mHandled = true; 
       mCaughtActivityNotFoundException = false; 
      } 
      void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { 
       final String imageMimeType = "image/*"; 
       final String videoMimeType = "video/*"; 
       final String audioMimeType = "audio/*"; 
       final String mediaSourceKey = "capture"; 
       final String mediaSourceValueCamera = "camera"; 
       final String mediaSourceValueFileSystem = "filesystem"; 
       final String mediaSourceValueCamcorder = "camcorder"; 
       final String mediaSourceValueMicrophone = "microphone"; 
       // According to the spec, media source can be 'filesystem' or 'camera' or 'camcorder' 
       // or 'microphone' and the default value should be 'filesystem'. 
       String mediaSource = mediaSourceValueFileSystem; 
       if (mUploadMessage != null) { 
        // Already a file picker operation in progress. 
        return; 
       } 
       mUploadMessage = uploadMsg; 
       // Parse the accept type. 
       String params[] = acceptType.split(";"); 
       String mimeType = params[0]; 
       if (capture.length() > 0) { 
        mediaSource = capture; 
       } 
       if (capture.equals(mediaSourceValueFileSystem)) { 
        // To maintain backwards compatibility with the previous implementation 
        // of the media capture API, if the value of the 'capture' attribute is 
        // "filesystem", we should examine the accept-type for a MIME type that 
        // may specify a different capture value. 
        for (String p : params) { 
         String[] keyValue = p.split("="); 
         if (keyValue.length == 2) { 
          // Process key=value parameters. 
          if (mediaSourceKey.equals(keyValue[0])) { 
           mediaSource = keyValue[1]; 
          } 
         } 
        } 
       } 
       //Ensure it is not still set from a previous upload. 
       mCameraFilePath = null; 
       if (mimeType.equals(imageMimeType)) { 
        if (mediaSource.equals(mediaSourceValueCamera)) { 
         // Specified 'image/*' and requested the camera, so go ahead and launch the 
         // camera directly. 
         startActivity(createCameraIntent()); 
         return; 
        } else { 
         // Specified just 'image/*', capture=filesystem, or an invalid capture parameter. 
         // In all these cases we show a traditional picker filetered on accept type 
         // so launch an intent for both the Camera and image/* OPENABLE. 
         Intent chooser = createChooserIntent(createCameraIntent()); 
         chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(imageMimeType)); 
         startActivity(chooser); 
         return; 
        } 
       } else if (mimeType.equals(videoMimeType)) { 
        if (mediaSource.equals(mediaSourceValueCamcorder)) { 
         // Specified 'video/*' and requested the camcorder, so go ahead and launch the 
         // camcorder directly. 
         startActivity(createCamcorderIntent()); 
         return; 
        } else { 
         // Specified just 'video/*', capture=filesystem or an invalid capture parameter. 
         // In all these cases we show an intent for the traditional file picker, filtered 
         // on accept type so launch an intent for both camcorder and video/* OPENABLE. 
         Intent chooser = createChooserIntent(createCamcorderIntent()); 
         chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(videoMimeType)); 
         startActivity(chooser); 
         return; 
        } 
       } else if (mimeType.equals(audioMimeType)) { 
        if (mediaSource.equals(mediaSourceValueMicrophone)) { 
         // Specified 'audio/*' and requested microphone, so go ahead and launch the sound 
         // recorder. 
         startActivity(createSoundRecorderIntent()); 
         return; 
        } else { 
         // Specified just 'audio/*', capture=filesystem of an invalid capture parameter. 
         // In all these cases so go ahead and launch an intent for both the sound 
         // recorder and audio/* OPENABLE. 
         Intent chooser = createChooserIntent(createSoundRecorderIntent()); 
         chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(audioMimeType)); 
         startActivity(chooser); 
         return; 
        } 
       } 
       // No special handling based on the accept type was necessary, so trigger the default 
       // file upload chooser. 
       startActivity(createDefaultOpenableIntent()); 
      } 
      private void startActivity(Intent intent) { 
       try { 
        mController.getActivity().startActivityForResult(intent, Controller.FILE_SELECTED); 
       } catch (ActivityNotFoundException e) { 
        // No installed app was able to handle the intent that 
        // we sent, so fallback to the default file upload control. 
        try { 
         mCaughtActivityNotFoundException = true; 
         mController.getActivity().startActivityForResult(createDefaultOpenableIntent(), 
           Controller.FILE_SELECTED); 
        } catch (ActivityNotFoundException e2) { 
         // Nothing can return us a file, so file upload is effectively disabled. 
         Toast.makeText(mController.getActivity(), R.string.uploads_disabled, 
           Toast.LENGTH_LONG).show(); 
        } 
       } 
      } 
      private Intent createDefaultOpenableIntent() { 
       // Create and return a chooser with the default OPENABLE 
       // actions including the camera, camcorder and sound 
       // recorder where available. 
       Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
       i.addCategory(Intent.CATEGORY_OPENABLE); 
       i.setType("*/*"); 
       Intent chooser = createChooserIntent(createCameraIntent(), createCamcorderIntent(), 
         createSoundRecorderIntent()); 
       chooser.putExtra(Intent.EXTRA_INTENT, i); 
       return chooser; 
      } 
      private Intent createChooserIntent(Intent... intents) { 
       Intent chooser = new Intent(Intent.ACTION_CHOOSER); 
       chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents); 
       chooser.putExtra(Intent.EXTRA_TITLE, 
         mController.getActivity().getResources() 
           .getString(R.string.choose_upload)); 
       return chooser; 
      } 
      private Intent createOpenableIntent(String type) { 
       Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
       i.addCategory(Intent.CATEGORY_OPENABLE); 
       i.setType(type); 
       return i; 
      } 
      private Intent createCameraIntent() { 
       Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       File externalDataDir = Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_DCIM); 
       File cameraDataDir = new File(externalDataDir.getAbsolutePath() + 
         File.separator + "browser-photos"); 
       cameraDataDir.mkdirs(); 
       mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator + 
         System.currentTimeMillis() + ".jpg"; 
       cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath))); 
       return cameraIntent; 
      } 
      private Intent createCamcorderIntent() { 
       return new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
      } 
      private Intent createSoundRecorderIntent() { 
       return new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 
      } 
     } 
    } 









enter code here 
+0

URL hữu ích: http://stackoverflow.com/questions/18874282/webview-email-link-mailto –

Trả lời

3

Tôi nghĩ webView.setWebViewClient(new WebViewClient()); này nên được một cái gì đó như thế này:

webView.setWebViewClient(new WebViewClient() { 

      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 

       if (url.startsWith("tel:")) { 
        initiateCall(url); 
        return true; 
       } 
       if (url.startsWith("mailto:")) { 
        sendEmail(url.substring(7)); 
        return true; 
       } 

       return false; 
      } 

Sendmail sẽ là:

private void sendEmail(String add) { 
     Intent i = new Intent(Intent.ACTION_SEND); 
     i.setType("text/plain"); 
     i.putExtra(Intent.EXTRA_EMAIL, new String[] { add }); 
      try { 
     startActivity(Intent.createChooser(i, "Send mail...")); 
     } catch (android.content.ActivityNotFoundException ex) { 
     Toast.makeText(WebViewActivity.this, 
     "There are no email clients installed.", Toast.LENGTH_SHORT) 
     .show(); 
     } 

     } 
+0

Điều gì về bắt đầu url cuộc gọi –

+0

Làm việc như một sự quyến rũ –

0

Tôi không biết về trường hợp của bạn, nhưng điều này đang làm việc cho tôi.

private class MyWebClient extends WebViewClient { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 

     Uri uri; 
     try { 
      uri = Uri.parse(url); 
     } catch (NullPointerException e) { 
      // let Android deal with this 
      return true; 
     } 

     String host = uri.getHost(); // Host is null when user clicked on email, phone number, ... 

     if (host != null && host.equals("stackoverflow.com")) { 
      // This is my web site, so do not override; let my WebView load the page 
      return false; 
     } 
     else { 
      // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs or anything else (email, phone number, ...) 
      // Always do this, because WebView is poor in security terms 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
      startActivity(intent); 
      return true; 
     } 
    } 

Và gán nó

webView.setWebChromeClient(new MyWebChromeClient()); 
0

Đây là giải pháp của bạn:

webView.setWebViewClient(new WebViewClient() 
    { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView wv, String url) { 
     if(url.contains("mailto")){ 
      System.out.println("mailto"); 
     } 
    return true; 
    }      
}); 
Các vấn đề liên quan