【软件应用开发】小米便签APP维护开发

本文主要介绍在小米便签APP原有功能的基础上,设计并实现了便签添加图片的功能,从开发过程、运行界面、源代码三个方面进行详细介绍。
本文引用小米便签社区开源版代码:https://github.com/MiCode/Notes
小米便签APP维护开发完整源代码地址:https://download.csdn.net/download/weixin_47936614/85436044

开发工具:Android Studio
开发环境:操作系统win10、jdk1.8.0

目录

    • 一、开发过程
    • 二、运行界面
    • 三、源代码


一、开发过程

  1. 首先在note_edit.xml文件中添加add_img_btn按钮;
  2. 在NoteEditActivity.java文件的onCreate()方法中,为这个“添加图片”按钮设置监听器,点击添加图片按钮时,会触发点击事件;
  3. 重写onActivityResult()来处理返回的数据,并将图片的路径也写入到数据库;
  4. 点击一个note后,会初始化note的内容,并通过convertToImage()将路径转化为图片;
  5. 在退出清单模式之后,仍应该将图片路径的位置替换为图片。

在编辑便签界面添加图片功能的程序流程图如图1所示。
在这里插入图片描述

二、运行界面

在便签编辑界面中,点击“添加图片”按钮,选择相应的图片,插入到便签中,插入图片过程如图2所示。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在插入图片后可以继续编辑便签,输入相应的文字或图片,保存便签后退出。当用户再次查看便签时,图片和文字在相应的位置展示出来,如图3所示。
在这里插入图片描述在这里插入图片描述
用户在编辑便签界面选择“进入清单模式”,便签进入清单模式,图片以路径方式显示,当用户选择“退出清单模式”后,图片将在相应位置显示出来。如图4所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、源代码

  • 添加图片按钮的xml代码(FilePath: MiNotes\app\src\main\res\layout\note_edit.xml)
<ImageButtonandroid:id="@+id/add_img_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="7dp"android:layout_marginTop="600dp"android:layout_marginBottom="7dp"android:src="@android:drawable/ic_menu_gallery" />
  • onCreate()方法(FilePath: MiNotes\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java)
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(R.layout.note_edit);if (savedInstanceState == null && !initActivityState(getIntent())) {finish();return;}initResources();//根据id获取添加图片按钮final ImageButton add_img_btn = (ImageButton) findViewById(R.id.add_img_btn);//为点击图片按钮设置监听器add_img_btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d(TAG, "onClick: click add image button");//ACTION_GET_CONTENT: 允许用户选择特殊种类的数据,并返回(特殊种类的数据:照一张相片或录一段音)Intent loadImage = new Intent(Intent.ACTION_GET_CONTENT);//Category属性用于指定当前动作(Action)被执行的环境.//CATEGORY_OPENABLE; 用来指示一个ACTION_GET_CONTENT的intentloadImage.addCategory(Intent.CATEGORY_OPENABLE);loadImage.setType("image/*");startActivityForResult(loadImage, PHOTO_REQUEST);}});
}
  • convertToImage()方法(FilePath: MiNotes\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java)
//路径字符串格式 转换为 图片image格式
private void convertToImage() {NoteEditText noteEditText = (NoteEditText) findViewById(R.id.note_edit_view); //获取当前的editEditable editable = noteEditText.getText();//1.获取textString noteText = editable.toString(); //2.将note内容转换为字符串int length = editable.length(); //内容的长度//3.截取img片段 [local]+uri+[local],提取urifor(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个字符就是pathString 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()方法(FilePath: MiNotes\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java)
//重写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;}
}
  • getPath()方法(FilePath: MiNotes\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java)
//获取文件的real path
public String getPath(final Context context, final Uri uri) {final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;// DocumentProviderif (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
//            elseif (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);}}// Mediaelse if ("content".equalsIgnoreCase(uri.getScheme())) {return getDataColumn(context, uri, null, null);}// Fileelse if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}return null;
}

小米便签APP维护开发完整源代码地址:https://download.csdn.net/download/weixin_47936614/85436044

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/66219.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

粗谈小米商业模式

01小米的“新零售” https://mp.weixin.qq.com/s/-_VLWX25eXdo6su8sE01nA 零售&#xff1a;其实就是信息流、资金流、物流的三种基本要素的万千组合。商品展现的参观和体验是信息流&#xff1b;付款收款是资金流&#xff1b;自己取回或快递送家是物流&#xff1b; 电商相对于…

新媒体短视频运营培训骗局

现在新媒体短视频运营培训的广告铺天盖地&#xff0c;是不是骗子啊?现在很多人会有这样的疑问&#xff0c;针对这个问题&#xff0c;我还是提醒同学们提高警惕&#xff0c;市场上有好有坏&#xff0c;就像当初UI设计四个月骗局一样&#xff0c;同学们还是保持一定的甄别意识。…

为什么做短视频你的一直不爆?

大家好&#xff0c;我是我赢助手短视频运营&#xff0c;专注于短视频去水印、去重和文案提取及短视频运营创作。 今天给大家分享的为什么做短视频你的一直不爆&#xff1f; 你在做账号之前&#xff0c;最多准备了多少条视频&#xff0c;有五条吗&#xff1f;有三十条吗&#…

某音短视频评论采集翻页(移动安全篇)

本章测试一个作品的评论及翻页&#xff1a; 以及前面的抓x包方式&#xff0c;在专栏里也有很多&#xff0c;xposed抓包过sslping&#xff0c;通用版本等&#xff1b; https://codeooo.blog.csdn.net/category_11500477.html 翻页通过页码来控制&#xff1a; # -*- coding:…

IT技能产品做短视频宣传应该怎么做?短视频宣传策略分析

对于IT技能产品来说&#xff0c;短视频宣传已经成为一种有效的宣传策略&#xff0c;能够有效地传播信息、激发消费者的兴趣。下面将从几个方面对IT技能产品短视频宣传策略进行分析&#xff1a; 在制作短视频的时候&#xff0c;要充分考虑到产品的特性&#xff0c;做出吸引人的短…

做短视频创业之前必须确定的内容:变现形式,短视频玩法和人设定位

做短视频创业之前必须确定的内容&#xff1a;变现形式&#xff0c;短视频玩法和人设定位。这是短视频的根基&#xff0c;打好基础才能更好的实现盈利目标。 开始做短视频的时候&#xff0c;走了很多弯路&#xff0c;这段时间总结了之前的经验教训&#xff0c;结合在我赢助手上…

什么类型的短视频更容易吸粉?分享三种短视频类型,可参考

什么类型的短视频更容易吸粉&#xff1f;分享三种短视频类型&#xff0c;可参考 现在做短视频的人越来越多&#xff0c;有趣有创意的短视频更是层出不穷&#xff0c;而这也就让刚接触短视频的小白们犯难了&#xff1a;好像每一种短视频都很能吸引粉丝&#xff0c;那么自己究竟…

视频号容易被官方封号的违规操作,你中招了吗?

视频号作为一个新崛起的流量池,已经成为许多企业、淘金者追捧的新流量阵地,但目前平台规则还不是那么完善,这就非常考验创作者的运营额能力和政策敏感度。 无论是哪个平台,一旦触碰红线,不管你的作品有多厉害、粉丝有多少,哪怕是不小心,也会受到相应的惩罚。 轻则限流…

视频号|常见违规限流情况及解除方法

在视频号创作过程中&#xff0c;大家有没有遇到过视频号限流的问题&#xff1f;或者直接收到过视频号官方发出的违规通知&#xff1f; 视频号被限流&#xff0c;最能在视频播放数据上体现出来。比如&#xff0c;平时的播放数据一直很好&#xff0c;突然间数据就变差了&#xf…

年薪百万难求的AI新技能:Prompt工程中文教程来了!

写出优质的提示词&#xff0c;让AI生成惊艳的图文作品。 ——这就是如今年薪百万仍一人难求的提示词工程师们在解决的问题。大语言模型时代下&#xff0c;不断涌现出众多让人瞳孔地震的绘画、拍案叫绝的文案&#xff0c;它们的创作者并非传统定义的画家、作家&#xff0c;而是这…

巴比特 | 元宇宙每日必读:AIGC的监管来了!国家网信办发布生成式人工智能服务管理办法(征求意见稿),哪些红线不能碰?...

摘要&#xff1a;随着AIGC迅猛发展&#xff0c;相关风险也逐渐显露出来。4 月 11 日&#xff0c;国家互联网信息办公室发布关于《生成式人工智能服务管理办法&#xff08;征求意见稿&#xff09;》公开征求意见的通知。征求意见稿拟规定&#xff0c;利用生成式人工智能生成的内…

谷歌2022年Q4净利润同比下滑34%,还能靠广告业务翻身么?

在美联储加息、宏观环境低迷的情况下&#xff0c;科技巨头们的日子并不好过。 2月2日美股盘后&#xff0c;数字广告和搜索巨头、谷歌母公司Alphabet发布了2022年四季度财报。财报显示&#xff0c;2022年Q4其总营收为760.48亿美元&#xff0c;略低于分析师预期的765亿美元&#…

AGI 通用人工智能的演变 | The Evolution of Artificial General Intelligence

目录 AGI Introduction | 通用人工智能介绍 一、引言 二、AGI 的概念和定义

喜大普奔!微软开发基于 Chromium 的浏览器

&#xff08;给程序员的那些事加星标&#xff09; 原创整理&#xff1a;程序员的那些事&#xff08;id&#xff1a;iProgrammer&#xff09; 大家以前应该听过类似的段子&#xff1a; 微软正在开发下一代浏览器&#xff0c;性能大提升&#xff0c;下载 Chrome 的速度将提升 3 倍…

Eege浏览器和Chrome浏览器选中文本朗读

Edge AND Chrome 方法一&#xff08;Edge专属&#xff09;&#xff1a; 选中文字直接右键&#xff0c;选中朗读所选内容即可&#xff08;这个操作直接秒杀所有朗读插件&#xff0c;音色也很棒&#xff09; 方法二&#xff08;Edge和Chrome通用&#xff09;&#xff1a; 下载…

告别 .com网址时代,Opera浏览器实现用Emoji符号打开网站

在平时聊天和上网时&#xff0c;你会经常使用表情符号吗&#xff1f;相信大部人的回答是“会”。合理地使用表情符号可以减少文字表达的枯燥乏味&#xff0c;也可以准确地表达出自己的内心活动和想法。如今&#xff0c;浏览器提供商Opera和网址提供商Yat合作推出了全新的功能&a…

大模型创新中心落户上海!助推AI框架生态共建进入加速道

明敏 发自 凹非寺量子位 | 公众号 QbitAI 大模型时代一来&#xff0c;AI框架扮演的角色愈加重要。 行业深谙此理&#xff0c;于是人工智能框架生态峰会2023为此召开。 参会的成员都是产学研界耳熟能详的名字&#xff1a;上海人工智能研究院、中国科学院自动化研究所、上海白玉兰…

应用统计432考研复试复试提问总结精简版【一】

一、区间估计与假设检验的联系与区别 联系&#xff1a;二者利用样本进行推断&#xff0c;都属于推断统计区别&#xff1a; 原理&#xff1a; 前者是基于大概率&#xff0c;后者基于小概率&#xff1b;统计量&#xff1a;前者是构造枢轴量&#xff08;不含未知参数&#xff0c;…

跨考生复试时被问到跨考专业原因,该如何回答?

现在跨考生越来越多。 对于跨考生&#xff0c;在考研复试时&#xff0c;有的导师很喜欢问关于跨专业方面的问题&#xff0c;比如&#xff1a;选择跨专业的原因&#xff1f; 该如何回答才能容易获得导师青睐呢&#xff1f; 这不仅是一个专业问题更是考验同学们情商的问题。对于跨…

通达信日线数据用转换为excel、csv和feather格式

python功能虽然强大&#xff0c;但由于术业有专攻&#xff0c;不少股民朋友不擅长写代码&#xff0c;对python望而却步。今天开始写一个小软件&#xff0c;主要作用是可以直接运行python代码&#xff0c;进行股票数据处理和分析。 上一篇文章介绍了股票数据直接导入到数据库中…