APP开发一般分原生开发和H5开发,接入方式有所不同。
1.H5开发的APP可以使用客服代码嵌入方式,也可以使用客服直连,和网页接入没有区别。
2.原生代码开发的APP通过webview组件嵌入客服直连的方式接入;如果需要支持语音发送,文件图片传输等功能,需要做一些处理,请参考以下示例;
1.H5开发的APP可以使用客服代码嵌入方式,也可以使用客服直连,和网页接入没有区别。
2.原生代码开发的APP通过webview组件嵌入客服直连的方式接入;如果需要支持语音发送,文件图片传输等功能,需要做一些处理,请参考以下示例;
package com.xxx.activity; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.provider.MediaStore; import android.text.TextUtils; import android.view.KeyEvent; import android.webkit.DownloadListener; import android.webkit.JavascriptInterface; import android.webkit.JsResult; import android.webkit.PermissionRequest; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import com.xxx.R; import java.io.File; public class MorningH5Activity extends AppCompatActivity { private ValueCallbackmUploadMessage; private ValueCallback mUploadMessage5; public static final int FILECHOOSER_RESULTCODE = 5173; public static final int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 5174; private WebView webView; @Override public void initView() { setContentView(R.layout.activity_worksheet_service); webView=(WebView) findViewById(R.id.web_view); WebSettings set = webView.getSettings(); set.setJavaScriptEnabled(true); set.setUseWideViewPort(true); set.setLoadWithOverviewMode(true); set.setAllowFileAccess(true); } @Override public boolean onKeyDown(int keyCode ,KeyEvent keyEvent){ if(keyCode==keyEvent.KEYCODE_BACK){//监听返回键,如果可以后退就后退 if(webView.canGoBack()){ webView.goBack(); return true; } } return super.onKeyDown(keyCode, keyEvent); } @Override public void initData(Bundle arg0) { webView.setWebChromeClient(new MyChromeClient()); webView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_BROWSABLE); intent.setData(Uri.parse(url)); startActivity(intent); } }); String url=getIntent().getStringExtra("url"); if (!TextUtils.isEmpty(url)){ webView.loadUrl(url); } } @Override protected void onDestroy() { super.onDestroy(); webView.destroy(); } @SuppressLint("NewApi") @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (requestCode == FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) { return; } Uri result = intent == null || resultCode != Activity.RESULT_OK ? null : intent.getData(); mUploadMessage.onReceiveValue(result); mUploadMessage = null; } else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5) { if (null == mUploadMessage5) { return; } mUploadMessage5.onReceiveValue(WebChromeClient.FileChooserParams .parseResult(resultCode, intent)); mUploadMessage5 = null; } } public class MyChromeClient extends WebChromeClient { @Override public void onPermissionRequest(PermissionRequest request) { if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){ request.grant(request.getResources()); request.getOrigin(); } } @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { // return super.onJsAlert(view, url, message, result); result.confirm(); return true; } @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); if (title != null) { tv_title.setText(title); } } // For Android < 3.0 public void openFileChooser(ValueCallback uploadMsg){ this.openFileChooser(uploadMsg, "*/*"); } // For Android >= 3.0 public void openFileChooser(ValueCallback uploadMsg, String acceptType) { this.openFileChooser(uploadMsg, acceptType, null); } // For Android >= 4.1 public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("*/*"); startActivityForResult(Intent.createChooser(i, "文件浏览"), FILECHOOSER_RESULTCODE); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public boolean onShowFileChooser(WebView mWebView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { if (mUploadMessage5 != null) { mUploadMessage5.onReceiveValue(null); mUploadMessage5 = null; } mUploadMessage5 = filePathCallback; Intent intent = fileChooserParams.createIntent(); try { startActivityForResult(intent, FILECHOOSER_RESULTCODE_FOR_ANDROID_5); } catch (ActivityNotFoundException e) { mUploadMessage5 = null; return false; } return true; } } }