Как отобразить HTML с динамическими удаленными встроенными изображениями в textView с Android ImageGetter? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь извлечь html с URL-адресами встроенного изображения, используя html.ImageGetter для отображения в TextView, код работает нормально, однако есть две проблемы, требующие обхода, и Я ищулучшая альтернатива, если мне не хватает лучшего подхода.

1: params в doInBackground принимает (String) params[0] с URL-адресом как \"http://developer.android.com/assets/images/icon_search.png\", однако он выбрасываетошибка как MalformedURLException, которую необходимо очистить, удалив обратную косую черту и кавычки.

Обходной путь

String result = source.substring(2,source.lengeth()-2);

2 : код работает нормально, если URL-адрес изображения закодирован или не имеет пробела, если URL-адресимеет некоторое пространство, в котором params принимает URL, пока не будет найдено первое пространство. Например,

, если URL-адрес \"http://developer.android.com/assets/images/icon search with space.png\"

String source = (String) params[0];, прочитать URL-адрес как \"http://developer.android.com/assets/images/icon

Обходной путь

Необходимо проанализировать полный текст HTML, чтобы найти все изображения, заменить изображение на закодированный URL, а затем передать новый HTML.

String source = "this is a test of <b>ImageGetter</b> it contains two images: <br/><img src=\"http://developer.android.com/assets/images/dac_logo.png\"><br/>and<br/><img src=\"http://developer.android.com/assets/images/icon_search.png\">";

String newSource = someFunctionToEncodeAndReplaceImgSource(source);                   

 Spanned spanned = Html.fromHtml(newSource, MyActivity.this, null);

CODE

public class MyActivity extends AppCompatActivity implements Html.ImageGetter {

    TextView desc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        desc = findViewById(R.id.desc);
        String source = "this is a test of <b>ImageGetter</b> it contains two images: <br/><img src=\"http://developer.android.com/assets/images/dac_logo.png\"><br/>and<br/><img src=\"http://developer.android.com/assets/images/icon_search.png\">";
                    Spanned spanned = Html.fromHtml(source, MyActivity.this, null);
                    desc.setText(spanned);


    }

    private void handleQuestionDetails(QuestionResponseData questionAttributes) {
        if (questionAttributes == null) {
            AppUtils.showToast(PracticeSetAttemptActivity.this, "There is some error!", Toast.LENGTH_SHORT);
        }
        AppUtils.showToast(PracticeSetAttemptActivity.this, "Success", Toast.LENGTH_SHORT);
        quesDescription.setText(Html.fromHtml(questionAttributes.getQuestion().getQues_description()));

        nextQuesId = String.valueOf(questionAttributes.getNextId());
    }

    @Override
    public Drawable getDrawable(String source) {
        LevelListDrawable d = new LevelListDrawable();
        Drawable empty = getResources().getDrawable(R.drawable.tick_icon);
        d.addLevel(0, 0, empty);
        d.setBounds(0, 0, empty.getIntrinsicWidth(), empty.getIntrinsicHeight());
        new LoadImage().execute(source, d);

        return d;
    }

    @SuppressLint("StaticFieldLeak")
    class LoadImage extends AsyncTask<Object, Void, Bitmap> {

        private LevelListDrawable mDrawable;

        @Override
        protected Bitmap doInBackground(Object... params) {
            String source = (String) params[0];
            // have to replace backslash and then pass
            mDrawable = (LevelListDrawable) params[1];

            try {
                InputStream is = new java.net.URL(source).openStream();
                return BitmapFactory.decodeStream(is);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            if (bitmap != null) {
                BitmapDrawable d = new BitmapDrawable(bitmap);
                mDrawable.addLevel(1, 1, d);
                mDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
                mDrawable.setLevel(1);
                CharSequence t = quesDescription.getText();
                quesDescription.refreshDrawableState();
                quesDescription.setText(t);
            }
        }
    }

    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }
}
...