diff --git a/doc/泛读分析和维护报告.docx b/doc/泛读分析和维护报告.docx index 8559734..ef788e5 100644 Binary files a/doc/泛读分析和维护报告.docx and b/doc/泛读分析和维护报告.docx differ diff --git a/src/main/java/net/micode/notes/gtask/data/SqlData.java b/src/main/java/net/micode/notes/gtask/data/SqlData.java index 2bf0273..7fdfd17 100644 --- a/src/main/java/net/micode/notes/gtask/data/SqlData.java +++ b/src/main/java/net/micode/notes/gtask/data/SqlData.java @@ -71,9 +71,9 @@ public class SqlData { private ContentValues mDiffDataValues; - public SqlData(Context context) { + public SqlData(Context context) {//初始化对象,用于存储数据 mContentResolver = context.getContentResolver(); - mIsCreate = true; + mIsCreate = true;//一类型的变量为true mDataId = INVALID_ID; mDataMimeType = DataConstants.NOTE; mDataContent = ""; @@ -82,14 +82,14 @@ public class SqlData { mDiffDataValues = new ContentValues(); } - public SqlData(Context context, Cursor c) { + public SqlData(Context context, Cursor c) {//同样是存储数据,另外定义支持冲cursor读入 mContentResolver = context.getContentResolver(); - mIsCreate = false; + mIsCreate = false;//二类型的变量为false loadFromCursor(c); mDiffDataValues = new ContentValues(); } - private void loadFromCursor(Cursor c) { + private void loadFromCursor(Cursor c) {//上面用到的从cursor读取的函数,从存储的各个列获取数据 mDataId = c.getLong(DATA_ID_COLUMN); mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); mDataContent = c.getString(DATA_CONTENT_COLUMN); @@ -97,9 +97,9 @@ public class SqlData { mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); } - public void setContent(JSONObject js) throws JSONException { - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; - if (mIsCreate || mDataId != dataId) { + public void setContent(@androidx.annotation.NonNull JSONObject js) throws JSONException {//获取json类型的参数,并且根据它更新自定义的数据单元中的值 + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;//如果有id直接赋值,没有则需要在获取 + if (mIsCreate || mDataId != dataId) {//初始未设置的数据单元通过它设置内容,通过cursor产生的数据元可通过它完成更新 mDiffDataValues.put(DataColumns.ID, dataId); } mDataId = dataId; @@ -131,7 +131,7 @@ public class SqlData { } public JSONObject getContent() throws JSONException { - if (mIsCreate) { + if (mIsCreate) {//同样的只有通过cursor产生的数据单元可通过这个函数获取数据 Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } @@ -144,7 +144,7 @@ public class SqlData { return js; } - public void commit(long noteId, boolean validateVersion, long version) { + public void commit(long noteId, boolean validateVersion, long version) {//提交数据,并且打上类似于标签的版本号以及验证值 if (mIsCreate) { if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { @@ -162,12 +162,12 @@ public class SqlData { } else { if (mDiffDataValues.size() > 0) { int result = 0; - if (!validateVersion) { + if (!validateVersion) { // 不验证版本的情况下,直接使用ContentResolver更新指定ID的数据 result = mContentResolver.update(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); - } else { + } else { // 需要验证版本的情况下,使用ContentResolver进行条件更新操作 result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { String.valueOf(noteId), String.valueOf(version) diff --git a/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/src/main/java/net/micode/notes/gtask/data/SqlNote.java index 79a4095..48891a6 100644 --- a/src/main/java/net/micode/notes/gtask/data/SqlNote.java +++ b/src/main/java/net/micode/notes/gtask/data/SqlNote.java @@ -122,7 +122,7 @@ public class SqlNote { private ArrayList mDataList; - public SqlNote(Context context) { + public SqlNote(Context context) {//定义数据单元存储数据 mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = true; @@ -135,7 +135,7 @@ public class SqlNote { mParentId = 0; mSnippet = ""; mType = Notes.TYPE_NOTE; - mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;//直接从设置的属性中获取值 mWidgetType = Notes.TYPE_WIDGET_INVALIDE; mOriginParent = 0; mVersion = 0; @@ -147,14 +147,14 @@ public class SqlNote { mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = false; - loadFromCursor(c); + loadFromCursor(c);//从cursor中直接获取变量值 mDataList = new ArrayList(); if (mType == Notes.TYPE_NOTE) loadDataContent(); mDiffNoteValues = new ContentValues(); } - public SqlNote(Context context, long id) { + public SqlNote(Context context, long id) {//根据id初始化数据单元 mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = false; @@ -175,7 +175,7 @@ public class SqlNote { }, null); if (c != null) { c.moveToNext(); - loadFromCursor(c); + loadFromCursor(c);//通过调用减少重复代码编写 } else { Log.w(TAG, "loadFromCursor: cursor = null"); } @@ -185,7 +185,7 @@ public class SqlNote { } } - private void loadFromCursor(Cursor c) { + private void loadFromCursor(Cursor c) {//直接使用get获得变量值 mId = c.getLong(ID_COLUMN); mAlertDate = c.getLong(ALERTED_DATE_COLUMN); mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); @@ -200,7 +200,7 @@ public class SqlNote { mVersion = c.getLong(VERSION_COLUMN); } - private void loadDataContent() { + private void loadDataContent() {//这个函数判别查询的数据是否存在,并且读取到数据列表中存储 Cursor c = null; mDataList.clear(); try { @@ -210,12 +210,12 @@ public class SqlNote { }, null); if (c != null) { if (c.getCount() == 0) { - Log.w(TAG, "it seems that the note has not data"); + Log.w(TAG, "it seems that the note has not data");//遇到文件为空抛出对应的异常 return; } while (c.moveToNext()) { SqlData data = new SqlData(mContext, c); - mDataList.add(data); + mDataList.add(data);//向Datalist中加入读取到的数据 } } else { Log.w(TAG, "loadDataContent: cursor = null"); @@ -226,7 +226,8 @@ public class SqlNote { } } - public boolean setContent(JSONObject js) { + public boolean setContent(JSONObject js) {//设置数据单元中变量的值 + //如果所需的值存在,直接赋值使用,否则再先进行一步读取 try { JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { @@ -359,7 +360,7 @@ public class SqlNote { return true; } - public JSONObject getContent() { + public JSONObject getContent() {//直接读取的方式将所需的数据读到对应变量 try { JSONObject js = new JSONObject(); @@ -412,6 +413,7 @@ public class SqlNote { mDiffNoteValues.put(NoteColumns.PARENT_ID, id); } + //定义一些简单的获取取值的方法 public void setGtaskId(String gid) { mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); } @@ -440,7 +442,7 @@ public class SqlNote { return mType == Notes.TYPE_NOTE; } - public void commit(boolean validateVersion) { + public void commit(boolean validateVersion) {//将数据做一定修改提交 if (mIsCreate) { if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { mDiffNoteValues.remove(NoteColumns.ID); diff --git a/src/main/java/net/micode/notes/gtask/data/Task.java b/src/main/java/net/micode/notes/gtask/data/Task.java index 6a19454..4d68293 100644 --- a/src/main/java/net/micode/notes/gtask/data/Task.java +++ b/src/main/java/net/micode/notes/gtask/data/Task.java @@ -32,7 +32,7 @@ import org.json.JSONException; import org.json.JSONObject; -public class Task extends Node { +public class Task extends Node {//继承Node类的属性 private static final String TAG = Task.class.getSimpleName(); private boolean mCompleted; @@ -54,7 +54,7 @@ public class Task extends Node { mMetaInfo = null; } - public JSONObject getCreateAction(int actionId) { + public JSONObject getCreateAction(int actionId) {//创建一个初始的任务对象,并对它赋初值 JSONObject js = new JSONObject(); try { @@ -103,7 +103,7 @@ public class Task extends Node { return js; } - public JSONObject getUpdateAction(int actionId) { + public JSONObject getUpdateAction(int actionId) {//更新任务 JSONObject js = new JSONObject(); try { @@ -120,7 +120,7 @@ public class Task extends Node { // entity_delta JSONObject entity = new JSONObject(); entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - if (getNotes() != null) { + if (getNotes() != null) {//如果笔记不为空,更新笔记 entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); } entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); @@ -135,11 +135,11 @@ public class Task extends Node { return js; } - public void setContentByRemoteJSON(JSONObject js) { + public void setContentByRemoteJSON(JSONObject js) {//通过远端的json设置内容的值 if (js != null) { try { // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {//如果值已经被json对象所具备,则直接进行设置 setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); } @@ -175,7 +175,7 @@ public class Task extends Node { } } - public void setContentByLocalJSON(JSONObject js) { + public void setContentByLocalJSON(JSONObject js) {//通过本地的json文件来设置内容 if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) || !js.has(GTaskStringUtils.META_HEAD_DATA)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); @@ -204,7 +204,7 @@ public class Task extends Node { } } - public JSONObject getLocalJSONFromContent() { + public JSONObject getLocalJSONFromContent() {//通过本地的内容,生成json文件 String name = getName(); try { if (mMetaInfo == null) { @@ -216,7 +216,7 @@ public class Task extends Node { JSONObject js = new JSONObject(); JSONObject note = new JSONObject(); - JSONArray dataArray = new JSONArray(); + JSONArray dataArray = new JSONArray();//声明所有所要用到的变量 JSONObject data = new JSONObject(); data.put(DataColumns.CONTENT, name); dataArray.put(data); @@ -227,7 +227,7 @@ public class Task extends Node { } else { // synced task JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);//提取出所有的信息 for (int i = 0; i < dataArray.length(); i++) { JSONObject data = dataArray.getJSONObject(i); @@ -258,11 +258,11 @@ public class Task extends Node { } } - public int getSyncAction(Cursor c) { + public int getSyncAction(Cursor c) {//同步缓存 try { JSONObject noteInfo = null; if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { - noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);//更新到最新的笔记信息 } if (noteInfo == null) { @@ -311,14 +311,14 @@ public class Task extends Node { return SYNC_ACTION_ERROR; } - public boolean isWorthSaving() { + public boolean isWorthSaving() {//只要有信息就认为是值得保存的,返回true return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) || (getNotes() != null && getNotes().trim().length() > 0); } public void setCompleted(boolean completed) { this.mCompleted = completed; - } + }//进行前面使用过的调用函数返回值的对应 public void setNotes(String notes) { this.mNotes = notes; diff --git a/src/main/java/net/micode/notes/gtask/data/TaskList.java b/src/main/java/net/micode/notes/gtask/data/TaskList.java index 4ea21c5..95d6bf5 100644 --- a/src/main/java/net/micode/notes/gtask/data/TaskList.java +++ b/src/main/java/net/micode/notes/gtask/data/TaskList.java @@ -30,17 +30,17 @@ import org.json.JSONObject; import java.util.ArrayList; -public class TaskList extends Node { +public class TaskList extends Node {//同Task一样,继承了Node private static final String TAG = TaskList.class.getSimpleName(); private int mIndex; - private ArrayList mChildren; + private ArrayList mChildren;//内部含有一个Task的列,是任务的序列 public TaskList() { super(); mChildren = new ArrayList(); - mIndex = 1; + mIndex = 1;//初始化 } public JSONObject getCreateAction(int actionId) { @@ -74,7 +74,7 @@ public class TaskList extends Node { return js; } - public JSONObject getUpdateAction(int actionId) { + public JSONObject getUpdateAction(int actionId) {//更新行动与Task中定义的基本一样 JSONObject js = new JSONObject(); try { @@ -104,7 +104,7 @@ public class TaskList extends Node { } public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { + if (js != null) {//类似的通过远端更新内容 try { // id if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { @@ -129,7 +129,7 @@ public class TaskList extends Node { } } - public void setContentByLocalJSON(JSONObject js) { + public void setContentByLocalJSON(JSONObject js) {//通过本地文件更新内容 if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); } @@ -215,26 +215,26 @@ public class TaskList extends Node { return SYNC_ACTION_ERROR; } - +//以上都与task定义类似 public int getChildTaskCount() { return mChildren.size(); } public boolean addChildTask(Task task) { boolean ret = false; - if (task != null && !mChildren.contains(task)) { + if (task != null && !mChildren.contains(task)) {//任务不为空,并且还不在列表中,则将其加入 ret = mChildren.add(task); - if (ret) { + if (ret) {//成功加入以后继续设置关系 // need to set prior sibling and parent task.setPriorSibling(mChildren.isEmpty() ? null : mChildren .get(mChildren.size() - 1)); - task.setParent(this); + task.setParent(this);//设置任务的父子关系 } } return ret; } - public boolean addChildTask(Task task, int index) { + public boolean addChildTask(Task task, int index) {//更进一步的实现在指定索引位置插入任务 if (index < 0 || index > mChildren.size()) { Log.e(TAG, "add child task: invalid index"); return false; @@ -260,9 +260,9 @@ public class TaskList extends Node { return true; } - public boolean removeChildTask(Task task) { + public boolean removeChildTask(Task task) {//移除子任务 boolean ret = false; - int index = mChildren.indexOf(task); + int index = mChildren.indexOf(task);//查找其索引 if (index != -1) { ret = mChildren.remove(task); @@ -281,7 +281,7 @@ public class TaskList extends Node { return ret; } - public boolean moveChildTask(Task task, int index) { + public boolean moveChildTask(Task task, int index) {//定向移除对应位置的任务 if (index < 0 || index >= mChildren.size()) { Log.e(TAG, "move child task: invalid index"); @@ -299,7 +299,7 @@ public class TaskList extends Node { return (removeChildTask(task) && addChildTask(task, index)); } - public Task findChildTaskByGid(String gid) { + public Task findChildTaskByGid(String gid) {//通过Gid查找任务 for (int i = 0; i < mChildren.size(); i++) { Task t = mChildren.get(i); if (t.getGid().equals(gid)) { @@ -309,7 +309,7 @@ public class TaskList extends Node { return null; } - public int getChildTaskIndex(Task task) { + public int getChildTaskIndex(Task task) {//获取任务对应的索引 return mChildren.indexOf(task); } @@ -323,7 +323,7 @@ public class TaskList extends Node { public Task getChilTaskByGid(String gid) { for (Task task : mChildren) { - if (task.getGid().equals(gid)) + if (task.getGid().equals(gid))//找到一个gid相符的即为所要的任务 return task; } return null; diff --git a/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/main/java/net/micode/notes/ui/NoteEditActivity.java index 9738ffd..20d6f41 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -22,19 +22,34 @@ import android.app.AlertDialog; import android.app.PendingIntent; import android.app.SearchManager; import android.appwidget.AppWidgetManager; +import android.content.ContentResolver; import android.content.ContentUris; +import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; import android.graphics.Paint; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.os.Environment; import android.preference.PreferenceManager; +import android.provider.DocumentsContract; +import android.provider.MediaStore; +import android.text.Editable; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; import android.text.format.DateUtils; import android.text.style.BackgroundColorSpan; +import android.text.style.ImageSpan; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -43,10 +58,12 @@ import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; +import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -65,6 +82,7 @@ import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; import net.micode.notes.widget.NoteWidgetProvider_2x; import net.micode.notes.widget.NoteWidgetProvider_4x; +import java.io.FileNotFoundException; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -159,6 +177,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, private String mUserQuery; // 用户输入的查询字符串 private Pattern mPattern; // 用于匹配用户查询的正则表达式模式对象 + private final int PHOTO_REQUEST = 1;//请求码 /** * @classname: NoteEditActivity @@ -178,8 +197,22 @@ public class NoteEditActivity extends Activity implements OnClickListener, return; } initResources(); - } + //根据id获取添加图片的按钮 + final ImageButton add_img_btn = (ImageButton) findViewById(R.id.add_img_btn); + //为点击图片按钮设置监听器 + add_img_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Log.d(TAG, "onClick add image button"); + //允许用户插入特殊类型的数据 + Intent loadImage = new Intent(Intent.ACTION_GET_CONTENT); + loadImage.addCategory(Intent.CATEGORY_OPENABLE); + loadImage.setType("image/*"); + startActivityForResult(loadImage, PHOTO_REQUEST); + } + }); + } /** * Current activity may be killed when the memory is low. Once it is killed, for another time * user load this activity, we should restore the former state @@ -331,6 +364,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, * TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker * is not ready */ + //插入之后初始化 + convertToImage(); showAlertHeader(); } /** @@ -961,6 +996,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); mEditTextList.setVisibility(View.GONE); mNoteEditor.setVisibility(View.VISIBLE); + convertToImage(); } } /** @@ -1059,4 +1095,174 @@ public class NoteEditActivity extends Activity implements OnClickListener, private void showToast(int resId, int duration) { Toast.makeText(this, resId, duration).show(); } + //路径字符串格式 转换为 图片image格式 + private void convertToImage() { + NoteEditText noteEditText = (NoteEditText) findViewById(R.id.note_edit_view); //获取当前的edit + Editable editable = noteEditText.getText();//1.获取text + String noteText = editable.toString(); //2.将note内容转换为字符串 + int length = editable.length(); //内容的长度 + //3.截取img片段 [local]+uri+[local],提取uri + for(int i = 0; i < length; i++) { + for(int j = i; j < length; j++) { + String img_fragment = noteText.substring(i, j+1); //img_fragment:关于图片路径的片段 + if(img_fragment.length() > 15 && img_fragment.endsWith("[/local]") && img_fragment.startsWith("[local]")){ + int limit = 7; //[local]为7个字符 + //[local][/local]共15个字符,剩下的为真正的path长度 + int len = img_fragment.length()-15; + //从[local]之后的len个字符就是path + String path = img_fragment.substring(limit,limit+len);//获取到了图片路径 + Bitmap bitmap = null; + Log.d(TAG, "图片的路径是:"+path); + try { + bitmap = BitmapFactory.decodeFile(path);//将图片路径解码为图片格式 + } catch (Exception e) { + e.printStackTrace(); + } + if(bitmap!=null){ //若图片存在 + Log.d(TAG, "图片不为null"); + ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap); + //4.创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像 + String ss = "[local]" + path + "[/local]"; + SpannableString spannableString = new SpannableString(ss); + //5.将指定的标记对象附加到文本的开始...结束范围 + spannableString.setSpan(imageSpan, 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + Log.d(TAG, "Create spannable string success!"); + Editable edit_text = noteEditText.getEditableText(); + edit_text.delete(i,i+len+15); //6.删掉图片路径的文字 + edit_text.insert(i, spannableString); //7.在路径的起始位置插入图片 + } + } + } + } + } + + //重写onActivityResult()来处理返回的数据 + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + super.onActivityResult(requestCode, resultCode, intent); + ContentResolver resolver = getContentResolver(); + switch (requestCode) { + case PHOTO_REQUEST: + Uri originalUri = intent.getData(); //1.获得图片的真实路径 + Bitmap bitmap = null; + try { + bitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));//2.解码图片 + } catch (FileNotFoundException e) { + Log.d(TAG, "onActivityResult: get file_exception"); + e.printStackTrace(); + } + + if(bitmap != null){ + //3.根据Bitmap对象创建ImageSpan对象 + Log.d(TAG, "onActivityResult: bitmap is not null"); + ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap); + String path = getPath(this,originalUri); + //4.使用[local][/local]将path括起来,用于之后方便识别图片路径在note中的位置 + String img_fragment= "[local]" + path + "[/local]"; + //创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像 + SpannableString spannableString = new SpannableString(img_fragment); + spannableString.setSpan(imageSpan, 0, img_fragment.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + //5.将选择的图片追加到EditText中光标所在位置 + NoteEditText e = (NoteEditText) findViewById(R.id.note_edit_view); + int index = e.getSelectionStart(); //获取光标所在位置 + Log.d(TAG, "Index是: " + index); + Editable edit_text = e.getEditableText(); + edit_text.insert(index, spannableString); //将图片插入到光标所在位置 + + mWorkingNote.mContent = e.getText().toString(); + //6.把改动提交到数据库中,两个数据库表都要改的 + ContentResolver contentResolver = getContentResolver(); + ContentValues contentValues = new ContentValues(); + final long id = mWorkingNote.getNoteId(); + contentValues.put("snippet",mWorkingNote.mContent); + contentResolver.update(Uri.parse("content://micode_notes/note"), contentValues,"_id=?",new String[]{""+id}); + ContentValues contentValues1 = new ContentValues(); + contentValues1.put("content",mWorkingNote.mContent); + contentResolver.update(Uri.parse("content://micode_notes/data"), contentValues1,"mime_type=? and note_id=?", new String[]{"vnd.android.cursor.item/text_note",""+id}); + + }else{ + Toast.makeText(NoteEditActivity.this, "获取图片失败", Toast.LENGTH_SHORT).show(); + } + break; + default: + break; + } + } + + //获取文件的real path + public String getPath(final Context context, final Uri uri) { + + final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; + + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider +// if (isExternalStorageDocument(uri)) { +// final String docId = DocumentsContract.getDocumentId(uri); +// final String[] split = docId.split(":"); +// final String type = split[0]; +// +// if ("primary".equalsIgnoreCase(type)) { +// return Environment.getExternalStorageDirectory() + "/" + split[1]; +// } +// } +// // DownloadsProvider +// else if (isDownloadsDocument(uri)) { +// final String id = DocumentsContract.getDocumentId(uri); +// final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); +// return getDataColumn(context, contentUri, null, null); +// } + // MediaProvider +// else + if (isMediaDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } + + final String selection = "_id=?"; + final String[] selectionArgs = new String[]{split[1]}; + + return getDataColumn(context, contentUri, selection, selectionArgs); + } + } + // Media + else if ("content".equalsIgnoreCase(uri.getScheme())) { + return getDataColumn(context, uri, null, null); + } + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) { + return uri.getPath(); + } + return null; + } + + //获取数据列_获取此 Uri 的数据列的值。这对MediaStore Uris 和其他基于文件的 ContentProvider。 + public String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { + + Cursor cursor = null; + final String column = "_data"; + final String[] projection = {column}; + + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); + if (cursor != null && cursor.moveToFirst()) { + final int column_index = cursor.getColumnIndexOrThrow(column); + return cursor.getString(column_index); + } + } finally { + if (cursor != null) + cursor.close(); + } + return null; + } + + //是否为媒体文件 + public boolean isMediaDocument(Uri uri) { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + } diff --git a/src/main/res/layout/note_edit.xml b/src/main/res/layout/note_edit.xml index 10b2aa7..eca025e 100644 --- a/src/main/res/layout/note_edit.xml +++ b/src/main/res/layout/note_edit.xml @@ -395,6 +395,15 @@ android:layout_marginRight="6dip" android:layout_marginBottom="-7dip" android:src="@drawable/selected" /> + +