[关闭]
@RitcheeQinG 2020-08-11T03:18:58.000000Z 字数 2231 阅读 486

记一个部分Oppo手机复制后崩溃的问题

Android


出现原因大概是Oppo搞幺蛾子,特定机型 + 安卓版本下,复制时弹Toast导致报错,具体原因搞不清楚,仅提供一个解决办法:
不走系统的复制方法,我们手动实现复制
这里懒得认真写了,上代码

  1. import android.content.ClipData;
  2. import android.content.ClipboardManager;
  3. import android.content.Context;
  4. import android.os.Build;
  5. import android.text.Editable;
  6. import android.view.ActionMode;
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.widget.EditText;
  10. /**
  11. * 本类为了处理部分Oppo手机(R9s, R11等)在特定安卓版本(6.0.1, 7.1.1等)
  12. * EditText复制文字时出现的crash
  13. * 部分报错信息:
  14. * android.view.InflateException: Binary XML file line #27: Binary XML file line #27: Error inflating class TextView
  15. * Caused by: android.view.InflateException: Binary XML file line #27: Error inflating class TextView
  16. * Caused by: java.lang.ArrayIndexOutOfBoundsException: length=16; index=4400
  17. */
  18. public class OppoEditTextOptimizer {
  19. private static final String BRAND_OPPO = "oppo";
  20. public static void optimize(EditText editText) {
  21. if (isOppoOptimizeEnabled()) {
  22. setCustomCopyAction(editText);
  23. }
  24. }
  25. private static boolean isOppoOptimizeEnabled() {
  26. String brand = Build.BRAND;
  27. if (null != brand) {
  28. if (!BRAND_OPPO.equals(brand.toLowerCase())) {
  29. return false;
  30. }
  31. return Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1;
  32. }
  33. return false;
  34. }
  35. /**
  36. * 屏蔽掉官方默认的复制实现,改为手动实现复制粘贴功能
  37. */
  38. private static void setCustomCopyAction(EditText editText) {
  39. editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
  40. @Override
  41. public boolean onCreateActionMode(ActionMode mode, Menu menu) {
  42. return true;
  43. }
  44. @Override
  45. public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
  46. return false;
  47. }
  48. @Override
  49. public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
  50. if (item.getItemId() == android.R.id.copy) {
  51. onDoCopy(editText);
  52. return true;
  53. }
  54. return false;
  55. }
  56. @Override
  57. public void onDestroyActionMode(ActionMode mode) {
  58. }
  59. });
  60. }
  61. private static void onDoCopy(EditText editText) {
  62. ClipboardManager manager = (ClipboardManager)editText.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
  63. if (null != manager) {
  64. final int selStart = editText.getSelectionStart();
  65. final int selEnd = editText.getSelectionEnd();
  66. int min = Math.max(0, Math.min(selStart, selEnd));
  67. int max = Math.max(0, Math.max(selStart, selEnd));
  68. Editable edit = editText.getText();
  69. String text = null == edit ? "" : edit.toString();
  70. String selectedText = text.isEmpty() ? "" : text.substring(min, max);
  71. final ClipData copyData = ClipData.newPlainText(null, selectedText);
  72. manager.setPrimaryClip(new ClipData(copyData));
  73. }
  74. }
  75. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注