@ -16,7 +16,12 @@
package net.micode.notes.ui ;
import android.content.ClipData ;
import android.content.ClipDescription ;
import android.content.ClipboardManager ;
import android.content.Context ;
import android.graphics.Bitmap ;
import android.graphics.BitmapFactory ;
import android.graphics.Rect ;
import android.text.Layout ;
import android.text.Selection ;
@ -31,11 +36,16 @@ import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener ;
import android.view.MotionEvent ;
import android.widget.EditText ;
import android.widget.Toast ;
import net.micode.notes.R ;
import net.micode.notes.tool.ImageUtils ;
import java.io.File ;
import java.util.HashMap ;
import java.util.Map ;
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
public class NoteEditText extends EditText {
private static final String TAG = "NoteEditText" ;
@ -52,6 +62,37 @@ public class NoteEditText extends EditText {
sSchemaActionResMap . put ( SCHEME_HTTP , R . string . note_link_web ) ;
sSchemaActionResMap . put ( SCHEME_EMAIL , R . string . note_link_email ) ;
}
/ * *
* 检 查 文 本 是 否 是 图 片 路 径
* @param text 要 检 查 的 文 本
* @return 是 否 是 图 片 路 径
* /
private boolean isImagePath ( String text ) {
if ( text = = null | | text . isEmpty ( ) ) {
return false ;
}
// 检查文本是否是有效的文件路径
File file = new File ( text ) ;
if ( ! file . exists ( ) ) {
return false ;
}
// 检查文件是否是图片类型
String fileName = file . getName ( ) ;
String extension = fileName . substring ( fileName . lastIndexOf ( '.' ) + 1 ) . toLowerCase ( ) ;
// 常见的图片文件扩展名
String [ ] imageExtensions = { "jpg" , "jpeg" , "png" , "gif" , "bmp" , "webp" } ;
for ( String ext : imageExtensions ) {
if ( extension . equals ( ext ) ) {
return true ;
}
}
return false ;
}
/ * *
* Call by the { @link NoteEditActivity } to delete or add edit text
@ -75,7 +116,18 @@ public class NoteEditText extends EditText {
void onTextChange ( int index , boolean hasText ) ;
}
/ * *
* Call by the { @link NoteEditActivity } to update format buttons state
* /
public interface OnSelectionChangedListener {
/ * *
* Called when the selection in the edit text changes
* /
void onSelectionChanged ( int start , int end ) ;
}
private OnTextViewChangeListener mOnTextViewChangeListener ;
private OnSelectionChangedListener mOnSelectionChangedListener ;
public NoteEditText ( Context context ) {
super ( context , null ) ;
@ -90,6 +142,18 @@ public class NoteEditText extends EditText {
mOnTextViewChangeListener = listener ;
}
public void setOnSelectionChangedListener ( OnSelectionChangedListener listener ) {
mOnSelectionChangedListener = listener ;
}
@Override
protected void onSelectionChanged ( int selStart , int selEnd ) {
super . onSelectionChanged ( selStart , selEnd ) ;
if ( mOnSelectionChangedListener ! = null ) {
mOnSelectionChangedListener . onSelectionChanged ( selStart , selEnd ) ;
}
}
public NoteEditText ( Context context , AttributeSet attrs ) {
super ( context , attrs , android . R . attr . editTextStyle ) ;
}
@ -214,4 +278,529 @@ public class NoteEditText extends EditText {
}
super . onCreateContextMenu ( menu ) ;
}
@Override
public boolean onTextContextMenuItem ( int id ) {
if ( id = = android . R . id . paste ) {
// 处理粘贴操作,检查剪贴板是否有图片
if ( handlePasteImage ( ) ) {
return true ;
}
}
return super . onTextContextMenuItem ( id ) ;
}
/ * *
* 插 入 图 片 到 编 辑 内 容
* @param imagePath 图 片 路 径
* /
public void insertImage ( final String imagePath ) {
Log . d ( TAG , "开始插入图片,路径: " + imagePath ) ;
// 确保在主线程中操作
post ( new Runnable ( ) {
@Override
public void run ( ) {
doInsertImage ( imagePath ) ;
}
} ) ;
}
/ * *
* 实 际 执 行 插 入 图 片 的 操 作
* @param imagePath 图 片 路 径
* /
private void doInsertImage ( String imagePath ) {
if ( TextUtils . isEmpty ( imagePath ) ) {
Log . e ( TAG , "图片路径为空" ) ;
Toast . makeText ( getContext ( ) , "图片路径为空" , Toast . LENGTH_SHORT ) . show ( ) ;
return ;
}
// 检查文件是否存在
java . io . File imageFile = new java . io . File ( imagePath ) ;
if ( ! imageFile . exists ( ) ) {
Log . e ( TAG , "图片文件不存在: " + imagePath ) ;
Toast . makeText ( getContext ( ) , "图片文件不存在: " + imagePath , Toast . LENGTH_SHORT ) . show ( ) ;
return ;
}
Log . d ( TAG , "图片文件存在,大小: " + imageFile . length ( ) + " bytes" ) ;
// 获取当前文本
android . text . Editable editable = getText ( ) ;
int start = getSelectionStart ( ) ;
Log . d ( TAG , "插入位置: " + start ) ;
// 添加图片标记,以便保存时能够正确保存图片路径
String imageTag = "[IMAGE]" + imagePath + "[/IMAGE]" ;
editable . insert ( start , imageTag ) ;
// 移动光标到图片标记后面
setSelection ( start + imageTag . length ( ) ) ;
// 处理图片标记,将其转换为 ImageSpan
processImageTags ( ) ;
// 强制刷新界面
invalidate ( ) ;
requestLayout ( ) ;
Log . d ( TAG , "强制刷新界面和布局" ) ;
// 显示成功提示
Toast . makeText ( getContext ( ) , "图片插入成功" , Toast . LENGTH_SHORT ) . show ( ) ;
Log . d ( TAG , "图片插入成功,路径: " + imagePath ) ;
Log . d ( TAG , "插入后文本长度: " + getText ( ) . length ( ) ) ;
}
/ * *
* 处 理 文 本 中 的 图 片 标 记 , 将 其 转 换 为 ImageSpan
* /
public void processImageTags ( ) {
android . text . Editable editable = getText ( ) ;
String text = editable . toString ( ) ;
Pattern pattern = Pattern . compile ( "\\[IMAGE\\](.*?)\\[/IMAGE\\]" ) ;
Matcher matcher = pattern . matcher ( text ) ;
// 从后往前处理,避免索引变化
while ( matcher . find ( ) ) {
String imagePath = matcher . group ( 1 ) ;
int start = matcher . start ( ) ;
int end = matcher . end ( ) ;
// 加载图片
try {
android . graphics . BitmapFactory . Options options = new android . graphics . BitmapFactory . Options ( ) ;
options . inSampleSize = 4 ;
options . inPreferredConfig = android . graphics . Bitmap . Config . RGB_565 ;
android . graphics . Bitmap bitmap = android . graphics . BitmapFactory . decodeFile ( imagePath , options ) ;
if ( bitmap ! = null ) {
// 保留原始标记,直接在标记上设置 ImageSpan
// 创建 ImageSpan
android . text . style . ImageSpan imageSpan = new android . text . style . ImageSpan ( getContext ( ) , bitmap ) ;
// 设置 ImageSpan
editable . setSpan ( imageSpan , start , end , android . text . Spannable . SPAN_EXCLUSIVE_EXCLUSIVE ) ;
Log . d ( TAG , "成功处理图片标记: " + imagePath ) ;
}
} catch ( Exception e ) {
Log . e ( TAG , "处理图片标记时出错: " + e . getMessage ( ) , e ) ;
}
}
// 强制刷新界面
invalidate ( ) ;
requestLayout ( ) ;
}
/ * *
* 处 理 粘 贴 图 片 的 逻 辑
* @return 是 否 成 功 处 理 了 图 片 粘 贴
* /
private boolean handlePasteImage ( ) {
Log . d ( TAG , "开始处理粘贴图片" ) ;
// 尝试使用专门的方法从剪贴板获取图片(针对虚拟机环境)
Log . d ( TAG , "尝试使用专门的方法从剪贴板获取图片" ) ;
Bitmap bitmap = ImageUtils . getImageFromClipboard ( getContext ( ) ) ;
if ( bitmap ! = null ) {
Log . d ( TAG , "成功从剪贴板获取图片: " + bitmap . getWidth ( ) + "x" + bitmap . getHeight ( ) ) ;
// 保存图片到本地存储
Log . d ( TAG , "尝试保存图片" ) ;
String imagePath = ImageUtils . saveImage ( getContext ( ) , bitmap ) ;
if ( imagePath ! = null ) {
Log . d ( TAG , "成功保存图片到: " + imagePath ) ;
// 生成图片标记
String imageTag = "[IMAGE]" + imagePath + "[/IMAGE]" ;
Log . d ( TAG , "生成图片标记: " + imageTag ) ;
// 将图片标记插入到文本中
int start = getSelectionStart ( ) ;
Log . d ( TAG , "插入位置: " + start ) ;
getText ( ) . insert ( start , imageTag ) ;
Log . d ( TAG , "成功插入图片标记" ) ;
Log . d ( TAG , "插入后文本长度: " + getText ( ) . length ( ) ) ;
Log . d ( TAG , "插入后文本内容: " + getText ( ) . toString ( ) ) ;
// 移动光标到图片标记后面
setSelection ( start + imageTag . length ( ) ) ;
Log . d ( TAG , "成功移动光标到位置: " + ( start + imageTag . length ( ) ) ) ;
// 强制刷新界面
invalidate ( ) ;
Log . d ( TAG , "强制刷新界面" ) ;
Toast . makeText ( getContext ( ) , "图片粘贴成功,路径: " + imagePath , Toast . LENGTH_LONG ) . show ( ) ;
Log . d ( TAG , "图片粘贴成功,路径: " + imagePath ) ;
return true ;
} else {
Log . e ( TAG , "保存图片失败" ) ;
Toast . makeText ( getContext ( ) , "图片保存失败" , Toast . LENGTH_SHORT ) . show ( ) ;
return true ;
}
} else {
Log . d ( TAG , "使用专门方法从剪贴板获取图片失败,尝试使用传统方法" ) ;
}
// 获取剪贴板管理器
ClipboardManager clipboard = ( ClipboardManager ) getContext ( ) . getSystemService ( Context . CLIPBOARD_SERVICE ) ;
// 检查剪贴板是否有内容
if ( clipboard = = null ) {
Log . e ( TAG , "剪贴板管理器为空" ) ;
Toast . makeText ( getContext ( ) , "剪贴板管理器不可用" , Toast . LENGTH_SHORT ) . show ( ) ;
return false ;
}
if ( ! clipboard . hasPrimaryClip ( ) ) {
Log . e ( TAG , "剪贴板为空" ) ;
Toast . makeText ( getContext ( ) , "剪贴板为空" , Toast . LENGTH_SHORT ) . show ( ) ;
return false ;
}
// 获取剪贴板内容
ClipData clip = clipboard . getPrimaryClip ( ) ;
if ( clip = = null ) {
Log . e ( TAG , "剪贴板内容为空" ) ;
Toast . makeText ( getContext ( ) , "剪贴板内容为空" , Toast . LENGTH_SHORT ) . show ( ) ;
return false ;
}
Log . d ( TAG , "剪贴板项目数量: " + clip . getItemCount ( ) ) ;
// 检查剪贴板描述
ClipDescription description = clipboard . getPrimaryClipDescription ( ) ;
if ( description ! = null ) {
Log . d ( TAG , "剪贴板描述: " + description . toString ( ) ) ;
for ( int i = 0 ; i < description . getMimeTypeCount ( ) ; i + + ) {
Log . d ( TAG , "MIME类型 " + i + ": " + description . getMimeType ( i ) ) ;
}
} else {
Log . e ( TAG , "剪贴板描述为空" ) ;
}
// 检查是否有图片
boolean foundContent = false ;
for ( int i = 0 ; i < clip . getItemCount ( ) ; i + + ) {
Log . d ( TAG , "处理剪贴板项目 " + i ) ;
ClipData . Item item = clip . getItemAt ( i ) ;
// 检查是否有URI( 可能是图片文件)
if ( item . getUri ( ) ! = null ) {
Log . d ( TAG , "找到URI: " + item . getUri ( ) . toString ( ) ) ;
foundContent = true ;
try {
// 尝试从URI加载图片
Log . d ( TAG , "尝试从URI加载图片: " + item . getUri ( ) . toString ( ) ) ;
Bitmap bitmapFromUri = BitmapFactory . decodeStream (
getContext ( ) . getContentResolver ( ) . openInputStream ( item . getUri ( ) ) ) ;
if ( bitmapFromUri ! = null ) {
Log . d ( TAG , "成功加载图片: " + bitmapFromUri . getWidth ( ) + "x" + bitmapFromUri . getHeight ( ) ) ;
// 保存图片到本地存储
Log . d ( TAG , "尝试保存图片" ) ;
String imagePath = ImageUtils . saveImage ( getContext ( ) , bitmapFromUri ) ;
if ( imagePath ! = null ) {
Log . d ( TAG , "成功保存图片到: " + imagePath ) ;
// 生成图片标记
String imageTag = "[IMAGE]" + imagePath + "[/IMAGE]" ;
Log . d ( TAG , "生成图片标记: " + imageTag ) ;
// 将图片标记插入到文本中
int start = getSelectionStart ( ) ;
Log . d ( TAG , "插入位置: " + start ) ;
getText ( ) . insert ( start , imageTag ) ;
Log . d ( TAG , "成功插入图片标记" ) ;
Log . d ( TAG , "插入后文本长度: " + getText ( ) . length ( ) ) ;
Log . d ( TAG , "插入后文本内容: " + getText ( ) . toString ( ) ) ;
// 移动光标到图片标记后面
setSelection ( start + imageTag . length ( ) ) ;
Log . d ( TAG , "成功移动光标到位置: " + ( start + imageTag . length ( ) ) ) ;
// 强制刷新界面
invalidate ( ) ;
Log . d ( TAG , "强制刷新界面" ) ;
Toast . makeText ( getContext ( ) , "图片粘贴成功,路径: " + imagePath , Toast . LENGTH_LONG ) . show ( ) ;
Log . d ( TAG , "图片粘贴成功,路径: " + imagePath ) ;
return true ;
} else {
Log . e ( TAG , "保存图片失败" ) ;
Toast . makeText ( getContext ( ) , "图片保存失败" , Toast . LENGTH_SHORT ) . show ( ) ;
return true ;
}
} else {
Log . e ( TAG , "从URI加载图片失败" ) ;
Toast . makeText ( getContext ( ) , "无法加载图片" , Toast . LENGTH_SHORT ) . show ( ) ;
}
} catch ( Exception e ) {
Log . e ( TAG , "加载图片时出错: " + e . getMessage ( ) ) ;
e . printStackTrace ( ) ;
Toast . makeText ( getContext ( ) , "加载图片时出错: " + e . getMessage ( ) , Toast . LENGTH_SHORT ) . show ( ) ;
}
} else {
Log . d ( TAG , "未找到URI" ) ;
}
// 尝试获取文本(可能包含图片路径或其他信息)
if ( item . getText ( ) ! = null ) {
String text = item . getText ( ) . toString ( ) ;
Log . d ( TAG , "找到文本: " + text ) ;
foundContent = true ;
// 检查文本是否是图片路径
if ( isImagePath ( text ) ) {
Log . d ( TAG , "文本是图片路径: " + text ) ;
// 尝试从路径加载图片
try {
Bitmap bitmapFromPath = BitmapFactory . decodeFile ( text ) ;
if ( bitmapFromPath ! = null ) {
Log . d ( TAG , "成功从路径加载图片: " + bitmapFromPath . getWidth ( ) + "x" + bitmapFromPath . getHeight ( ) ) ;
// 保存图片到本地存储
String imagePath = ImageUtils . saveImage ( getContext ( ) , bitmapFromPath ) ;
if ( imagePath ! = null ) {
Log . d ( TAG , "成功保存图片到: " + imagePath ) ;
// 生成图片标记
String imageTag = "[IMAGE]" + imagePath + "[/IMAGE]" ;
Log . d ( TAG , "生成图片标记: " + imageTag ) ;
// 将图片标记插入到文本中
int start = getSelectionStart ( ) ;
Log . d ( TAG , "插入位置: " + start ) ;
getText ( ) . insert ( start , imageTag ) ;
Log . d ( TAG , "成功插入图片标记" ) ;
Log . d ( TAG , "插入后文本长度: " + getText ( ) . length ( ) ) ;
Log . d ( TAG , "插入后文本内容: " + getText ( ) . toString ( ) ) ;
// 移动光标到图片标记后面
setSelection ( start + imageTag . length ( ) ) ;
Log . d ( TAG , "成功移动光标到位置: " + ( start + imageTag . length ( ) ) ) ;
// 强制刷新界面
invalidate ( ) ;
Log . d ( TAG , "强制刷新界面" ) ;
Toast . makeText ( getContext ( ) , "图片粘贴成功,路径: " + imagePath , Toast . LENGTH_LONG ) . show ( ) ;
Log . d ( TAG , "图片粘贴成功,路径: " + imagePath ) ;
return true ;
} else {
Log . e ( TAG , "保存图片失败" ) ;
Toast . makeText ( getContext ( ) , "图片保存失败" , Toast . LENGTH_SHORT ) . show ( ) ;
return true ;
}
} else {
Log . e ( TAG , "从路径加载图片失败: " + text ) ;
// 图片加载失败,直接粘贴文本内容
int start = getSelectionStart ( ) ;
getText ( ) . insert ( start , text ) ;
setSelection ( start + text . length ( ) ) ;
Toast . makeText ( getContext ( ) , "图片加载失败,已粘贴路径" , Toast . LENGTH_SHORT ) . show ( ) ;
Log . d ( TAG , "图片加载失败,已粘贴路径" ) ;
return true ;
}
} catch ( Exception e ) {
Log . e ( TAG , "从路径加载图片时出错: " + e . getMessage ( ) ) ;
e . printStackTrace ( ) ;
// 加载失败,直接粘贴文本内容
int start = getSelectionStart ( ) ;
getText ( ) . insert ( start , text ) ;
setSelection ( start + text . length ( ) ) ;
Toast . makeText ( getContext ( ) , "图片加载失败,已粘贴路径" , Toast . LENGTH_SHORT ) . show ( ) ;
Log . d ( TAG , "图片加载失败,已粘贴路径" ) ;
return true ;
}
} else {
// 不是图片路径,直接粘贴文本内容
int start = getSelectionStart ( ) ;
getText ( ) . insert ( start , text ) ;
setSelection ( start + text . length ( ) ) ;
Toast . makeText ( getContext ( ) , "文本粘贴成功" , Toast . LENGTH_SHORT ) . show ( ) ;
Log . d ( TAG , "文本粘贴成功" ) ;
return true ;
}
} else {
Log . d ( TAG , "未找到文本" ) ;
}
// 尝试获取Intent( 可能包含图片信息)
if ( item . getIntent ( ) ! = null ) {
Log . d ( TAG , "找到Intent: " + item . getIntent ( ) . toString ( ) ) ;
foundContent = true ;
// 尝试从Intent中提取图片
try {
android . content . Intent intent = item . getIntent ( ) ;
if ( intent . hasExtra ( android . content . Intent . EXTRA_STREAM ) ) {
android . net . Uri uri = ( android . net . Uri ) intent . getParcelableExtra ( android . content . Intent . EXTRA_STREAM ) ;
if ( uri ! = null ) {
Log . d ( TAG , "从Intent中找到图片URI: " + uri . toString ( ) ) ;
// 尝试从URI加载图片
Bitmap bitmapFromIntent = BitmapFactory . decodeStream (
getContext ( ) . getContentResolver ( ) . openInputStream ( uri ) ) ;
if ( bitmapFromIntent ! = null ) {
Log . d ( TAG , "成功从Intent加载图片: " + bitmapFromIntent . getWidth ( ) + "x" + bitmapFromIntent . getHeight ( ) ) ;
// 保存图片到本地存储
String imagePath = ImageUtils . saveImage ( getContext ( ) , bitmapFromIntent ) ;
if ( imagePath ! = null ) {
Log . d ( TAG , "成功保存图片到: " + imagePath ) ;
// 生成图片标记
String imageTag = "[IMAGE]" + imagePath + "[/IMAGE]" ;
Log . d ( TAG , "生成图片标记: " + imageTag ) ;
// 将图片标记插入到文本中
int start = getSelectionStart ( ) ;
Log . d ( TAG , "插入位置: " + start ) ;
getText ( ) . insert ( start , imageTag ) ;
Log . d ( TAG , "成功插入图片标记" ) ;
Log . d ( TAG , "插入后文本长度: " + getText ( ) . length ( ) ) ;
Log . d ( TAG , "插入后文本内容: " + getText ( ) . toString ( ) ) ;
// 移动光标到图片标记后面
setSelection ( start + imageTag . length ( ) ) ;
Log . d ( TAG , "成功移动光标到位置: " + ( start + imageTag . length ( ) ) ) ;
// 强制刷新界面
invalidate ( ) ;
Log . d ( TAG , "强制刷新界面" ) ;
Toast . makeText ( getContext ( ) , "图片粘贴成功,路径: " + imagePath , Toast . LENGTH_LONG ) . show ( ) ;
Log . d ( TAG , "图片粘贴成功,路径: " + imagePath ) ;
return true ;
} else {
Log . e ( TAG , "保存图片失败" ) ;
Toast . makeText ( getContext ( ) , "图片保存失败" , Toast . LENGTH_SHORT ) . show ( ) ;
return true ;
}
} else {
Log . e ( TAG , "从Intent URI加载图片失败" ) ;
}
}
}
} catch ( Exception e ) {
Log . e ( TAG , "从Intent加载图片时出错: " + e . getMessage ( ) ) ;
e . printStackTrace ( ) ;
}
} else {
Log . d ( TAG , "未找到Intent" ) ;
}
// 尝试获取HTML文本( 可能包含图片信息)
if ( android . os . Build . VERSION . SDK_INT > = android . os . Build . VERSION_CODES . N ) {
if ( item . getHtmlText ( ) ! = null ) {
String htmlText = item . getHtmlText ( ) . toString ( ) ;
Log . d ( TAG , "找到HTML文本: " + htmlText ) ;
foundContent = true ;
// 尝试从HTML中提取图片信息
if ( htmlText . contains ( "<img" ) ) {
Log . d ( TAG , "HTML文本中包含图片标签" ) ;
Toast . makeText ( getContext ( ) , "HTML文本中包含图片标签, 但暂不支持" , Toast . LENGTH_SHORT ) . show ( ) ;
}
} else {
Log . d ( TAG , "未找到HTML文本" ) ;
}
}
// 尝试使用ContentResolver获取剪贴板中的图片
try {
Log . d ( TAG , "尝试使用ContentResolver获取剪贴板中的图片" ) ;
android . content . ContentResolver resolver = getContext ( ) . getContentResolver ( ) ;
// 尝试获取剪贴板中的图片
android . net . Uri clipboardUri = null ;
if ( clip . getDescription ( ) . hasMimeType ( "image/*" ) ) {
clipboardUri = item . getUri ( ) ;
} else if ( clip . getDescription ( ) . hasMimeType ( "text/html" ) ) {
// 尝试从HTML中提取图片URI
Log . d ( TAG , "尝试从HTML中提取图片URI" ) ;
}
if ( clipboardUri ! = null ) {
Log . d ( TAG , "使用ContentResolver找到图片URI: " + clipboardUri . toString ( ) ) ;
Bitmap bitmapFromContentResolver = BitmapFactory . decodeStream (
resolver . openInputStream ( clipboardUri ) ) ;
if ( bitmapFromContentResolver ! = null ) {
Log . d ( TAG , "成功从ContentResolver加载图片: " + bitmapFromContentResolver . getWidth ( ) + "x" + bitmapFromContentResolver . getHeight ( ) ) ;
// 保存图片到本地存储
String imagePath = ImageUtils . saveImage ( getContext ( ) , bitmapFromContentResolver ) ;
if ( imagePath ! = null ) {
Log . d ( TAG , "成功保存图片到: " + imagePath ) ;
// 生成图片标记
String imageTag = "[IMAGE]" + imagePath + "[/IMAGE]" ;
Log . d ( TAG , "生成图片标记: " + imageTag ) ;
// 将图片标记插入到文本中
int start = getSelectionStart ( ) ;
Log . d ( TAG , "插入位置: " + start ) ;
getText ( ) . insert ( start , imageTag ) ;
Log . d ( TAG , "成功插入图片标记" ) ;
Log . d ( TAG , "插入后文本长度: " + getText ( ) . length ( ) ) ;
Log . d ( TAG , "插入后文本内容: " + getText ( ) . toString ( ) ) ;
// 移动光标到图片标记后面
setSelection ( start + imageTag . length ( ) ) ;
Log . d ( TAG , "成功移动光标到位置: " + ( start + imageTag . length ( ) ) ) ;
// 强制刷新界面
invalidate ( ) ;
Log . d ( TAG , "强制刷新界面" ) ;
Toast . makeText ( getContext ( ) , "图片粘贴成功,路径: " + imagePath , Toast . LENGTH_LONG ) . show ( ) ;
Log . d ( TAG , "图片粘贴成功,路径: " + imagePath ) ;
return true ;
} else {
Log . e ( TAG , "保存图片失败" ) ;
Toast . makeText ( getContext ( ) , "图片保存失败" , Toast . LENGTH_SHORT ) . show ( ) ;
return true ;
}
} else {
Log . e ( TAG , "从ContentResolver加载图片失败" ) ;
}
} else {
Log . d ( TAG , "未找到ContentResolver图片URI" ) ;
}
} catch ( Exception e ) {
Log . e ( TAG , "使用ContentResolver加载图片时出错: " + e . getMessage ( ) ) ;
e . printStackTrace ( ) ;
}
}
// 如果没有找到图片,显示提示
if ( foundContent ) {
Log . e ( TAG , "找到剪贴板内容,但无法识别为图片或文本" ) ;
Toast . makeText ( getContext ( ) , "无法识别剪贴板内容" , Toast . LENGTH_SHORT ) . show ( ) ;
} else {
Log . e ( TAG , "剪贴板中没有可识别的内容" ) ;
Toast . makeText ( getContext ( ) , "剪贴板中没有可识别的内容" , Toast . LENGTH_SHORT ) . show ( ) ;
}
return false ;
}
}