Я пытаюсь извлечь 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) {
}
}