修改富文本和图片插入不兼容部分 #20

Merged
p82feo7wg merged 1 commits from wangjiaqi_branch into master 4 months ago

@ -17,6 +17,7 @@
<!-- 已移除package属性已注释minSdkVersion可选删除 --> <!-- 已移除package属性已注释minSdkVersion可选删除 -->
<!-- <uses-sdk android:minSdkVersion="14" /> --> <!-- <uses-sdk android:minSdkVersion="14" /> -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_CONTACTS" />

@ -74,18 +74,7 @@
android:background="@drawable/bg_btn_set_color" /> android:background="@drawable/bg_btn_set_color" />
</LinearLayout> </LinearLayout>
<LinearLayout <!-- 富文本工具栏 - 单独放置 -->
android:id="@+id/sv_note_edit"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ImageView
android:layout_width="fill_parent"
android:layout_height="7dip"
android:background="@drawable/bg_color_btn_mask" />
<!-- 富文本工具栏 -->
<HorizontalScrollView <HorizontalScrollView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -120,6 +109,17 @@
</LinearLayout> </LinearLayout>
</HorizontalScrollView> </HorizontalScrollView>
<LinearLayout
android:id="@+id/sv_note_edit"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<ImageView
android:layout_width="fill_parent"
android:layout_height="7dip"
android:background="@drawable/bg_color_btn_mask" />
<ScrollView <ScrollView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="0dip" android:layout_height="0dip"

@ -85,6 +85,8 @@
<string name="error_note_empty_for_clock">不能为空便签设置闹钟提醒</string> <string name="error_note_empty_for_clock">不能为空便签设置闹钟提醒</string>
<string name="error_note_empty_for_send_to_desktop">不能将空便签发送到桌面</string> <string name="error_note_empty_for_send_to_desktop">不能将空便签发送到桌面</string>
<string name="error_formatting_not_supported_in_list_mode">清单模式下不支持格式化</string> <string name="error_formatting_not_supported_in_list_mode">清单模式下不支持格式化</string>
<string name="error_permission_denied">拒绝许可,无法访问图像</string>
<string name="error_image_insert_failed">插入失败,请再尝试一次</string>
<string name="error_please_select_text">请先选择文本</string> <string name="error_please_select_text">请先选择文本</string>
<string name="success_sdcard_export">导出成功</string> <string name="success_sdcard_export">导出成功</string>
<string name="failed_sdcard_export">导出失败</string> <string name="failed_sdcard_export">导出失败</string>

@ -90,6 +90,8 @@
<string name="error_note_empty_for_send_to_desktop">Sorry, can not send and empty note to home</string> <string name="error_note_empty_for_send_to_desktop">Sorry, can not send and empty note to home</string>
<string name="error_formatting_not_supported_in_list_mode">Formatting is not supported in list mode</string> <string name="error_formatting_not_supported_in_list_mode">Formatting is not supported in list mode</string>
<string name="error_please_select_text">Please select text first</string> <string name="error_please_select_text">Please select text first</string>
<string name="error_permission_denied">Permission denied, cannot access images</string>
<string name="error_image_insert_failed">Failed to insert image, please try again</string>
<string name="success_sdcard_export">Export successful</string> <string name="success_sdcard_export">Export successful</string>
<string name="failed_sdcard_export">Export fail</string> <string name="failed_sdcard_export">Export fail</string>
<string name="format_exported_file_location">Export text file (%1$s) to SD (%2$s) directory</string> <string name="format_exported_file_location">Export text file (%1$s) to SD (%2$s) directory</string>

@ -419,6 +419,8 @@ public class DataUtils {
public static String getFormattedSnippet(String snippet) { public static String getFormattedSnippet(String snippet) {
if (snippet != null) { if (snippet != null) {
snippet = snippet.trim(); snippet = snippet.trim();
// 替换[IMAGE]标签为友好的占位符
snippet = snippet.replaceAll("\\[IMAGE\\].*?\\[/IMAGE\\]", "[图片]");
int index = snippet.indexOf('\n'); int index = snippet.indexOf('\n');
if (index != -1) { if (index != -1) {
snippet = snippet.substring(0, index); snippet = snippet.substring(0, index);

@ -27,18 +27,26 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Paint; import android.graphics.Paint;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.Editable;
import android.text.Html; import android.text.Html;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.text.style.BackgroundColorSpan; import android.text.style.BackgroundColorSpan;
import android.text.style.StyleSpan; import android.text.style.StyleSpan;
import android.text.style.UnderlineSpan; import android.text.style.UnderlineSpan;
import android.graphics.Typeface; import android.text.style.ImageSpan;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
@ -51,23 +59,19 @@ import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import android.widget.ImageButton; import android.graphics.Typeface;
import android.provider.MediaStore; import android.graphics.Bitmap;
import android.net.Uri; import android.graphics.BitmapFactory;
import java.io.File;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Editable;
import android.text.style.ImageSpan;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Bitmap; // import android.support.annotation.NonNull;
import android.graphics.BitmapFactory; import android.Manifest;
import java.io.InputStream; import java.io.InputStream;
import net.micode.notes.R; import net.micode.notes.R;
@ -364,79 +368,22 @@ public class NoteEditActivity extends Activity implements OnClickListener,
mNoteEditor.setText(""); mNoteEditor.setText("");
mNoteEditor.setSelection(0); mNoteEditor.setSelection(0);
} else { } else {
Spannable spannable; // 第一步处理HTML编码字符将&#xxx;转换为实际字符
String decodedContent = content;
// 检查是否是HTML格式包含HTML标签
if (content.contains("<") && content.contains(">")) {
try { try {
// 从HTML格式恢复SpannableString保留样式加粗、斜体、下划线 // 使用Html.fromHtml解码HTML编码字符
// Html.fromHtml会自动将HTML标签转换为对应的Span decodedContent = Html.fromHtml(content).toString();
spannable = (Spannable) Html.fromHtml(content);
} catch (Exception e) { } catch (Exception e) {
// 如果HTML解析失败使用普通文本 Log.e(TAG, "Error decoding HTML content: " + e.getMessage());
Log.e(TAG, "Error parsing HTML content: " + e.getMessage());
spannable = new SpannableString(content);
}
} else {
// 普通文本格式直接创建SpannableString
spannable = new SpannableString(content);
} }
// 处理图片:将包含[IMAGE]标签的文本转换为包含ImageSpan的SpannableString // 第二步:处理[IMAGE]标签将其转换为ImageSpan
// 注意convertTextToSpannableWithImages会处理[IMAGE]标记,但会保留文本内容 SpannableString spannable = convertTextToSpannableWithImages(decodedContent);
String textContent = spannable.toString();
SpannableString finalSpannable = convertTextToSpannableWithImages(textContent);
// 将样式从原始Spannable复制到处理后的SpannableString
// 由于convertTextToSpannableWithImages可能改变了文本长度用空格替换了[IMAGE]标签),
// 我们需要基于文本内容来映射样式位置
if (textContent.length() == finalSpannable.length()) {
// 文本长度相同,直接复制样式
StyleSpan[] styleSpans = spannable.getSpans(0, spannable.length(), StyleSpan.class);
UnderlineSpan[] underlineSpans = spannable.getSpans(0, spannable.length(), UnderlineSpan.class);
for (StyleSpan span : styleSpans) { // 第三步:设置文本,确保文字和图片都能正常显示
int start = spannable.getSpanStart(span); mNoteEditor.setText(spannable);
int end = spannable.getSpanEnd(span);
if (start >= 0 && end <= finalSpannable.length() && start < end) {
finalSpannable.setSpan(new StyleSpan(span.getStyle()), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
for (UnderlineSpan span : underlineSpans) {
int start = spannable.getSpanStart(span);
int end = spannable.getSpanEnd(span);
if (start >= 0 && end <= finalSpannable.length() && start < end) {
finalSpannable.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
} else {
// 文本长度不同,说明有图片被处理了
// 这种情况下,样式位置需要重新计算
// 为了简化,我们基于原始文本位置映射样式(可能会有偏差,但应该能处理大部分情况)
StyleSpan[] styleSpans = spannable.getSpans(0, spannable.length(), StyleSpan.class);
UnderlineSpan[] underlineSpans = spannable.getSpans(0, spannable.length(), UnderlineSpan.class);
for (StyleSpan span : styleSpans) {
int start = Math.max(0, Math.min(spannable.getSpanStart(span), finalSpannable.length()));
int end = Math.max(start, Math.min(spannable.getSpanEnd(span), finalSpannable.length()));
if (start < end) {
finalSpannable.setSpan(new StyleSpan(span.getStyle()), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
for (UnderlineSpan span : underlineSpans) {
int start = Math.max(0, Math.min(spannable.getSpanStart(span), finalSpannable.length()));
int end = Math.max(start, Math.min(spannable.getSpanEnd(span), finalSpannable.length()));
if (start < end) {
finalSpannable.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
mNoteEditor.setText(finalSpannable);
// 将光标定位到文本末尾 // 将光标定位到文本末尾
mNoteEditor.setSelection(finalSpannable.length()); mNoteEditor.setSelection(spannable.length());
} }
} }
@ -472,6 +419,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
return new SpannableString(""); return new SpannableString("");
} }
Log.d(TAG, "Converting text to Spannable with images: " + text);
// 创建一个新的SpannableStringBuilder // 创建一个新的SpannableStringBuilder
SpannableStringBuilder builder = new SpannableStringBuilder(); SpannableStringBuilder builder = new SpannableStringBuilder();
@ -480,6 +429,8 @@ public class NoteEditActivity extends Activity implements OnClickListener,
int imageStart = text.indexOf("[IMAGE]", startIndex); int imageStart = text.indexOf("[IMAGE]", startIndex);
while (imageStart != -1) { while (imageStart != -1) {
Log.d(TAG, "Found [IMAGE] tag at position: " + imageStart);
// 添加[IMAGE]标签之前的文本 // 添加[IMAGE]标签之前的文本
builder.append(text.substring(startIndex, imageStart)); builder.append(text.substring(startIndex, imageStart));
@ -491,43 +442,97 @@ public class NoteEditActivity extends Activity implements OnClickListener,
break; break;
} }
Log.d(TAG, "Found [/IMAGE] tag at position: " + imageEnd);
// 提取图片URI // 提取图片URI
String imageUri = text.substring(imageStart + "[IMAGE]".length(), imageEnd); String imageUri = text.substring(imageStart + "[IMAGE]".length(), imageEnd);
Log.d(TAG, "Found image URI: " + imageUri); Log.d(TAG, "Extracted image URI: " + imageUri);
// 创建一个占位符字符串,用于插入ImageSpan // 保留原始的[IMAGE]uri[/IMAGE]标签,直接在上面添加ImageSpan
String placeholder = " "; String fullImageTag = "[IMAGE]" + imageUri + "[/IMAGE]";
int placeholderStart = builder.length(); int tagStart = builder.length();
builder.append(placeholder); builder.append(fullImageTag);
// 尝试将图片URI转换为Drawable并创建ImageSpan // 尝试将图片URI转换为Drawable并创建ImageSpan
try { try {
// 确保URI是有效的
Uri uri = Uri.parse(imageUri);
if (uri == null) {
Log.e(TAG, "Invalid URI: " + imageUri);
// 更新索引,继续处理下一个标签
startIndex = imageEnd + "[/IMAGE]".length();
imageStart = text.indexOf("[IMAGE]", startIndex);
continue;
}
Log.d(TAG, "Attempting to load image from URI: " + uri.toString());
// 使用BitmapFactory直接加载图片这是最可靠的方式
ContentResolver resolver = getContentResolver(); ContentResolver resolver = getContentResolver();
InputStream inputStream = resolver.openInputStream(Uri.parse(imageUri)); InputStream inputStream = null;
try {
inputStream = resolver.openInputStream(uri);
if (inputStream == null) {
Log.e(TAG, "Failed to open input stream for URI: " + uri.toString());
// 更新索引,继续处理下一个标签
startIndex = imageEnd + "[/IMAGE]".length();
imageStart = text.indexOf("[IMAGE]", startIndex);
continue;
}
// 解码图片
Bitmap bitmap = BitmapFactory.decodeStream(inputStream); Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
inputStream.close(); if (bitmap == null) {
Log.e(TAG, "Failed to decode bitmap from URI: " + uri.toString());
// 更新索引,继续处理下一个标签
startIndex = imageEnd + "[/IMAGE]".length();
imageStart = text.indexOf("[IMAGE]", startIndex);
continue;
}
Log.d(TAG, "Successfully decoded bitmap with dimensions: " + bitmap.getWidth() + "x" + bitmap.getHeight());
// 计算图片的合适大小确保它能适应EditText的宽度 // 计算图片的合适大小确保它能适应EditText的宽度
int screenWidth = getResources().getDisplayMetrics().widthPixels; int screenWidth = getResources().getDisplayMetrics().widthPixels;
// 减去左右边距,确保图片能完整显示
int maxWidth = screenWidth - 40;
int imageWidth = bitmap.getWidth(); int imageWidth = bitmap.getWidth();
int imageHeight = bitmap.getHeight(); int imageHeight = bitmap.getHeight();
float scale = (float) screenWidth / (float) imageWidth;
int scaledHeight = (int) (imageHeight * scale);
// 缩放图片 // 计算缩放比例
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, screenWidth, scaledHeight, true); float scale = 1.0f;
Drawable drawable = new android.graphics.drawable.BitmapDrawable(getResources(), scaledBitmap); if (imageWidth > maxWidth) {
scale = (float) maxWidth / (float) imageWidth;
}
Log.d(TAG, "Calculated scale: " + scale);
// 缩放图片(如果需要)
if (scale < 1.0f) {
bitmap = Bitmap.createScaledBitmap(bitmap, (int)(imageWidth * scale), (int)(imageHeight * scale), true);
Log.d(TAG, "Scaled bitmap to: " + bitmap.getWidth() + "x" + bitmap.getHeight());
}
// 创建Drawable并设置边界
Drawable drawable = new android.graphics.drawable.BitmapDrawable(getResources(), bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
// 创建ImageSpan并添加到SpannableStringBuilder中 // 创建ImageSpan并添加到SpannableStringBuilder中
ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
builder.setSpan(imageSpan, placeholderStart, placeholderStart + placeholder.length(), SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); builder.setSpan(imageSpan, tagStart, tagStart + fullImageTag.length(), SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
Log.d(TAG, "Successfully added ImageSpan for URI: " + imageUri);
} finally {
// 确保InputStream被正确关闭
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
Log.e(TAG, "Error closing input stream: " + e.toString());
}
}
}
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "Error loading image: " + e.toString()); Log.e(TAG, "Error loading image: " + e.toString());
// 如果加载图片失败直接显示图片URI e.printStackTrace();
builder.append("[IMAGE]");
builder.append(imageUri);
builder.append("[/IMAGE]");
} }
// 更新索引,继续查找下一个[IMAGE]标签 // 更新索引,继续查找下一个[IMAGE]标签
@ -538,6 +543,7 @@ public class NoteEditActivity extends Activity implements OnClickListener,
// 添加剩余的文本 // 添加剩余的文本
builder.append(text.substring(startIndex)); builder.append(text.substring(startIndex));
Log.d(TAG, "Final SpannableStringBuilder content: " + builder.toString());
return new SpannableString(builder); return new SpannableString(builder);
} }
@ -1266,16 +1272,10 @@ public class NoteEditActivity extends Activity implements OnClickListener,
} }
mWorkingNote.setWorkingText(sb.toString()); mWorkingNote.setWorkingText(sb.toString());
} else { } else {
// 保存时将SpannableString转换为HTML格式以保留样式信息 // 对于普通模式直接保存EditText中的原始文本
Spannable spannable = mNoteEditor.getText(); // 这样可以保留[IMAGE]标签,确保图片信息不会丢失
if (spannable != null && spannable.length() > 0) { String content = mNoteEditor.getText().toString();
// 将Spannable转换为HTML格式保留加粗、斜体、下划线等样式 mWorkingNote.setWorkingText(content);
// Html.toHtml会自动处理StyleSpan和UnderlineSpan
String htmlContent = Html.toHtml(spannable);
mWorkingNote.setWorkingText(htmlContent);
} else {
mWorkingNote.setWorkingText("");
}
} }
return hasChecked; return hasChecked;
} }
@ -1372,10 +1372,40 @@ public class NoteEditActivity extends Activity implements OnClickListener,
/** /**
* OMO * OMO
*/ */
private static final int REQUEST_CODE_PERMISSION_STORAGE = 101;
private void pickImageFromGallery() { private void pickImageFromGallery() {
// 检查并申请存储权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
// 申请权限
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION_STORAGE);
} else {
// 权限已授予,直接选择图片
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE); startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
} }
} else {
// Android 6.0以下版本,直接选择图片
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
}
}
// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_PERMISSION_STORAGE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予,执行图片选择
pickImageFromGallery();
} else {
// 权限被拒绝,显示提示
showToast(R.string.error_permission_denied);
}
}
}
/** /**
* OMO * OMO
@ -1388,27 +1418,50 @@ public class NoteEditActivity extends Activity implements OnClickListener,
Uri imageUri = data.getData(); Uri imageUri = data.getData();
if (imageUri != null) { if (imageUri != null) {
Log.d(TAG, "Image URI: " + imageUri.toString()); Log.d(TAG, "Image URI: " + imageUri.toString());
// 获取当前编辑器内容
Editable editable = mNoteEditor.getText();
int currentPosition = mNoteEditor.getSelectionStart();
try { try {
// 将图片路径添加到笔记内容中 // 1. 保存当前编辑器的原始内容,用于后续恢复
String currentContent = mNoteEditor.getText().toString(); String originalContent = editable.toString();
int originalSelection = mNoteEditor.getSelectionStart();
// 2. 插入完整的[IMAGE]uri[/IMAGE]标签到原始内容中
String imagePath = "[IMAGE]" + imageUri.toString() + "[/IMAGE]"; String imagePath = "[IMAGE]" + imageUri.toString() + "[/IMAGE]";
String newContent = currentContent + (currentContent.isEmpty() ? "" : "\n") + imagePath; StringBuilder sb = new StringBuilder(originalContent);
Log.d(TAG, "New content: " + newContent); sb.insert(originalSelection, imagePath);
String newContentWithTags = sb.toString();
// 直接设置文本不使用ImageSpan这样可以确保内容被保存 // 3. 首先将包含ImageSpan的SpannableString显示到编辑器中
mNoteEditor.setText(newContent); SpannableString spannable = convertTextToSpannableWithImages(newContentWithTags);
mNoteEditor.setSelection(newContent.length()); mNoteEditor.setText(spannable);
// 保存笔记内容,确保图片路径被正确存储 // 4. 然后将原始的[IMAGE]标签内容设置到WorkingNote中
saveNote(); mWorkingNote.setWorkingText(newContentWithTags);
// 5. 保存笔记注意这里不再调用getWorkingText()而是直接保存WorkingNote中的内容
// 我们需要修改saveNote()方法或者直接调用mWorkingNote.saveNote()
if (mWorkingNote.saveNote()) {
showToast(R.string.info_image_inserted); showToast(R.string.info_image_inserted);
} else {
showToast(R.string.error_image_insert_failed);
}
// 6. 将光标移动到图片后面
int newPosition = originalSelection + imagePath.length();
mNoteEditor.setSelection(newPosition);
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "Error inserting image: " + e.toString()); Log.e(TAG, "Error inserting image: " + e.toString());
showToast(R.string.error_note_not_exist); e.printStackTrace();
// 如果插入图片失败,显示错误信息
showToast(R.string.error_image_insert_failed);
} }
} else { } else {
Log.e(TAG, "Image URI is null"); Log.e(TAG, "Image URI is null");
showToast(R.string.error_note_not_exist); showToast(R.string.error_image_insert_failed);
} }
} else { } else {
Log.d(TAG, "Image selection canceled or failed, resultCode: " + resultCode); Log.d(TAG, "Image selection canceled or failed, resultCode: " + resultCode);

Loading…
Cancel
Save