Android基础 -- Activity之间传递数据(bitmap和map对象)

完美解决Activity之间传输Bitmap的三种方式 因为Intent只能传输数据容量很小的基本数据,当位图很大的时候,很有可能会出现传输错误 第一种:使用Intent,通过parcelable方式传递 //Activity One 【第一个活动ActivityA (传递)】 Intent intent = new Intent(this, Two.class); intent.putExtra("key", bitmap); //Activity Two 【第二个活动ActivityB (接收)】 //接收类型为 Bitmap ,通过getParce. 阅读详情

第一,传递HashMap对象

 HashMap本身已经实现了Cloneable, Serializable,Intent传递时,直接强转就可以了。

Map<String, String> params = new HashMap<>();
params.put("key", "value");
 
Intent intent = new Intent(app, Activity.class);
intent.putExtra("parmas",(Serializable)params);

2. 传递Bitmap

强调一遍一定不要通过Intent传

2.1 本地资源只传递R.id,然后通过resource去解析出来;

2.2 如果是SDCard中的文件,只传递Uri;

2.3 如果是网络流,先本地保存图片,然后再传递路径Uri。

另,Intent可传递的数据大小有限,具体多少我并未实际测试过,跟ROOM设置的APP最大内存也有关系,网上有人做了实际代码测试,地址:https://blog.youkuaiyun.com/wingichoy/article/details/50679322

=========================================

1)直接传递bitmap

直接传递有2中。一种是putExtra(),一种是转换为byte流。 
putExtra: http://www.jb51.net/article/40747.htm\

Byte流: http://blog.youkuaiyun.com/jdsjlzx/article/details/8362967

前者要简便些。二者都有同样的限制:图片太大时,测试时就显示不了。

(2)传递图片的uri

这个思路相对麻烦些。要先把bitmap流转换成uri类资源。事实是,中间还有过程。 
我不知道安卓系统有没有直接把bitmap流转换成uri类资源方法。我的处理是先将bitmap流转换为文件,再转换成uri类资源。

Bitmap转换成File:

public String saveBitmap(Bitmap mBitmap) {
        File file = new File(FILE_DIR);   //FILE_DIR自定义
        if (!file.exists()) {
            file.mkdir();
        }
        File tmpf = new File(file, setFileName() + ".jpg");
        File f = tmpf;
        try {
            f.createNewFile();
            FileOutputStream fOut = null;
            fOut = new FileOutputStream(f);
            mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);        
            fOut.flush();
            fOut.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String image_file_url=f.getAbsolutePath();
        Log.i("image_file_url", image_file_url);
        return image_file_url;
    }

获取文件的路径很重要。getAbsolutePath()是这类方法。 
接下来,

Uri imageUri = Uri.parse(saveBitmap(bitmap));
    intent.setData(imageUri);
    startActivity(intent);

另一个activity中,还要把uri中的资源还原到bitmap:

//获取Uri中的bitmap
    private Bitmap getBitmapFromUri(Uri uri)
    {
        try
        {
            // 读取uri资源中的bitmap
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
            return bitmap;
        }
        catch (Exception e)
        {
            Log.e("[Android]", e.getMessage());
            Log.e("[Android]", "目录为:" + uri);
            e.printStackTrace();
            return null;
        }
    }   

    //将Uri中图片相关数据转换成bitmap  
    private void Uri_to_bitmap(ImageView imageView) {           
        Intent intent = getIntent();
        if(intent != null){
            Uri uri = intent.getData();
            if (uri == null) {
                Log.i("tag", "The uri is not exist.");
                return;     
            }
            intent.setDataAndType(uri, "image/*");
            Bundle extras = intent.getExtras();     
            if (extras != null) {
                Bitmap photo = extras.getParcelable("intent");
                imageView.setImageBitmap(photo);    
            }else{
                Log.i("extras", "The extras is null.");
            }
        }else{
            Log.i("intent", "The intent is null.");
        }       
    }

一般将相机或图库中图片uri对应的bitmap取出,

// 读取uri资源中的bitmap
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);

如果你自定义的文件路径太偏僻了,用该方法可能无效。只能用这种方式:

Uri uri = Uri.fromFile(image_file);//image_file是File型

这里又回到获取文件路径的问题。这里的getBitmap()也有个问题:也会受限于图片过大。因此,对过大图片,时时注意释放缓存。

而且,还要针对安卓不同版本处理。

(3)传递图片的url

private Bitmap getBitmap(String path){
        //先解析图片边框的大小
        BitmapFactory.Options ops = new BitmapFactory.Options();
        ops.inJustDecodeBounds = true;
        Bitmap bm = BitmapFactory.decodeFile(path, ops);
        ops.inSampleSize = 1;
        int oHeight = ops.outHeight;
        int oWidth = ops.outWidth;
        //控制压缩比
        int contentHeight = 0;
        int contentWidth = 0;
        contentHeight = ITEM_HEIGHT; //自定义
        contentWidth = ITEM_WIDTH;   //自定义
        if(((float)oHeight/contentHeight) < ((float)oWidth/contentWidth)){
             ops.inSampleSize = (int) Math.ceil((float)oWidth/contentWidth);
        }else{
             ops.inSampleSize = (int) Math.ceil((float)oHeight/contentHeight);
        }
             ops.inJustDecodeBounds = false;
             bm = BitmapFactory.decodeFile(path, ops);
        return bm;
    }

onCreate()中添加:

        String img_url = getIntent().getStringExtra("img_url");     
        imgV.setImageBitmap(getBitmap(img_url));


以上是3种方式的demo。其中,困扰我比较久的有获取自定义文件路径、bitmap资源与uri之间的转换。

Buck电路自举电容串联小电阻:作用、选型计算与调试实战 在开关电源设计中,自举电容是高压侧NMOS栅极驱动能否可靠工作的关键。Buck电路中高侧开关管的源极随开关节点(SW)大幅摆动,需要借助自举电容将驱动电压抬升至输入电压以上,从而确保足够的Vgs。而自举电容的充电回路中串联的一颗小电阻,却常常被忽视:它既限制充电浪涌电流,保护内部自举二极管,又与电容构成RC滤波网络,抑制SW节点高频振铃向驱动端的耦合,同时还能缓冲死区期间的负压毛刺。阻值选取需要在充电时间常数与最小充电窗口之间权衡,典型值为1Ω到10Ω。实际调试中,高占空比掉压、轻载纹波异常、电阻发热等问题 阅读详情

相关推荐

Android编程使用Intent传递图片的方法详解

本文实例讲述了Android编程使用Intent传递图片的方法。分享给大家供大家参考,具体如下: 基本思路是先把bitmap转化为byte数组,用Intent传递数组,在将数组转化为bitmap bitmap转化为byte数组的方法: private byte[] Bitmap2Bytes(Bitmap bm){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray();

Android传递Bitmap的几种简单方式

转载请注明出处:http://blog.youkuaiyun.com/zhangphil Android传递Bitmap的几种简单方式 一,通过Intent的Bundle。 比如有两个activity,A,B,从A进入B。先在A中将Bitmap写进去: [java] view plain copy   Resources res=getResourc

sinat_30474567的博客 1万+

MIKE11实战:平原河网水动力建模从入门到精通(附GIS数据处理技巧)

本文系统介绍了MIKE11软件在平原河网水动力建模中的完整实战流程。从GIS数据预处理、河网构建、参数率定到结果分析,详细阐述了构建可靠数字孪生模型的关键步骤与技巧,旨在帮助水利工程师高效解决平原地区复杂水流模拟的挑战,为防洪决策提供科学依据。

weixin_28419039的博客 689

Android activity之间传递bitmap

项目场景: Android activity之间传递bitmap 问题描述: 练手Android项目的时候遇到的在两个activity之间传递位图,我不想用位图保存为文件然会传递文件地址或者将位图通过intent传递等方式。 解决方案: 用一个简单的单例保存需要传递的位图: public class DataService { public Bitmap editBitmap; private static DataService dataService; pub

ailiana的博客 756

1173:阶乘和

1173:阶乘和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6010 通过数: 3049 【题目描述】 用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。 输入正整数n,输出计算结果S。 【输入】 一个正整数n。 【输出】 计算结果S。 【输入样例】 5 【输出样例】 153 思路: ...

zqhf123的博客 1260

WinForm制作文件传输助手,Tcp局域网传输文件,传输速度受限于宽带和硬盘速度上限

文件传输助手为什么会出现,是因为项目上有些特殊的地方限制太多了,连插硬盘都需要关软件,联网又要开很不方便,网络限制一般软件只能局域网通信,还要开特定的端口等,你才能在电脑上通信,这样和机房的服务器远程的时候文件就不好拿过去,又不可能每次都去开机房的门。现在这个功能比较简单,只能单文件发送,但是其实比U盘硬盘方便,一般的六类网线传输压缩包在50M/s以上,U盘硬盘复制就不行了,特别如果是像我们学校这种网络结构,一个学校都在一个局域网,那真的方便!普通的局域网用特定IP和端口,通信也是很方便的。

m0_69233031的博客 1671

Android开发经验之intent传递大数据

在Activity或者组件之前传递信息时,一般采用intent绑定bundle的方式传值,但在使用过程中需要注意的是不要用bundle传递大容量数据:        在做项目的过程中,需要将听写界面的听写结果信息传递到听写记录界面供显示用,但是由于传递的数据量过大导致程序ANR,甚至直接报异常(传递的信息里面有bitmap转换成的byte数组、每一个词组的拼音、词语、语音信息),经过

woxinyijiuw的专栏 2万+

RV1126 ISP开发实战:从Tuner调试到IQ文件解析

本文详细介绍了RV1126 ISP开发的完整流程,从Tuner调试到IQ文件解析,涵盖了环境搭建、工具使用、参数配置及性能优化等关键环节。通过实战案例和避坑指南,帮助开发者快速掌握Rockchip芯片的ISP开发技巧,提升图像处理质量。

weixin_29195615的博客 571

byte数组和流 Seralizable:Android基础 -- Activity之间传递数据(bitmap和map对象)

博客源址:Android基础 -- Activity之间传递数据(bitmap和map对象) 博客时间:2014-04-06 21:50 做项目的时候需要用到在2个activity之间传递一些数据,之前做的都是些字符串之类的东东,结果这次卡了好久,折腾了一个下午。 第一个:传递bitmap   这个问题非常奇葩(可能我android水平还不够),居然不会报错,我是直接用

Android移动开发者的专栏 2562

2021.11.23 Covins 多机器人单目协同建图 跑Euroc数据集 更新

近日,一直在调试如何使用Covins跑通数据集,因为是初学者,所以很多bug出来的时候原理都不懂,只能复制——百度——尝试解决的过程。 现分享一下近日的结果以及与Covins作者帮助解答的一些问题。 使用代码行跑依次跑Euroc多数据集 这里的意思是使用作者提供的covins_examples文件夹中的euroc_examples_mh123_vigba.sh文件,这个文件是将三个Euroc数据集依次运行,跑完第一个数据集,第二个数据集运行的时候在第一个数据集生成地图的基础上继续绘制,由于我只下载了两个数据

qq_42614598的博客 2474

手把手教你用GNU Radio和PlutoSDR搭建FM收音机(附完整流程图)

本文提供了一份详细的实践指南,教你如何使用GNU Radio和PlutoSDR搭建一个功能完整的FM收音机。从软硬件环境准备、核心流程图构建,到运行调试与效果优化,手把手带你完成从射频信号接收、下变频、FM解调到音频输出的全过程,是入门软件定义无线电(SDR)的绝佳实践项目。

weixin_29189377的博客 749

Android之 Activity之间传递数据(bitmap和map对象)

做项目的时候需要用到在2个activity之间传递一些数据,之前做的都是些字符串之类的东东,结果这次卡了好久,折腾了一个下午。 第一个:传递bitmap   这个问题非常奇葩(可能我Android水平还不够),居然不会报错,我是直接用bundle或Intent的extral域直接存放bitmap,结果运行时各种宕机,各种界面乱窜(我非常的纳闷)。。。搜索之后看大家都说不能直接传递大于4

Android Linux MCU VC++ 539

24、中性原子量子计算:原理、方法与实验

本文系统介绍了中性原子量子计算的原理、方法与实验进展。重点阐述了利用碱金属原子作为量子比特,通过磁光阱、光偶极阱和光晶格等技术实现原子捕获与控制的方法。同时,详细分析了单量子比特门操作和量子态工程的实现手段,并总结了相关实验结果与未来发展方向。该技术路线为构建大规模量子计算系统提供了可行方案。

ol789012的博客 244

android activity 大小限制,【Android】intent传递数据时,数据大小的限制问题

Android开发人员都知道,Intent适用于在不同的Activity之间传递数据,包括参数、字符串、以及序列化的对象等。但是笔者所做的项目用到了使用Intent 传递Bitmap图片对象,图片的数据量相对来说是比较大的,那么intent能否胜任传递图片的任务呢?首先很明显bitmap实现了Android中的Parcelable接口,可以序列化。因此理所当然能够通过intent传递,然而图片的大...

weixin_35251837的博客 2018

蓝牙协议栈详解(3)——BTstack

BTstack是一个轻量级蓝牙协议栈,支持经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)。它采用事件驱动模型,可运行在MCU/CPU上,通过HCI接口与蓝牙控制器通信。协议栈包含完整的蓝牙协议层支持,如L2CAP、RFCOMM、ATT/GATT等,并提供丰富的示例代码。 主要特点包括模块化设计、开源授权、支持多种HCI传输方式(UART/USB)和操作系统适配。开发时需要关注事件驱动编程模型、内存配置优化、HCI传输稳定性等问题。典型应用场景包括SPP串口通信、BLE外设开发等。 使用建议从最小示例开始,逐

嵌入式软硬件叶玄 291

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Activity之间,Activity与Fragment之间传递Bitmap对象时程序崩溃的原因及解决办法

写在前面: 本人大四狗,在做毕业设计(一个仿网易云课堂的视频播放器)的时候遇到了几个问题,今天总结一下,避免以后再踏进同样地坑。引用一句俗语:人不能两次踏进一条河流。这篇博客主要总结第一个问题:Activity之间,Activity与Fragment之间传递Bitmap对象时程序崩溃的原因及解决办法。吹水就吹到这里了,下面进入主题。 效果图: 程序一打开先是一个闪屏页动画,主要在

StudentHc的博客 1911

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

activity之间传递数据相关问题

https://blog.youkuaiyun.com/rflyee/article/details/47431633 问题:传递bitmap提示数据过大 解决办法: 使用静态方法 package com.example.map9; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; public class DataHolder { private static final Dat

qq_34024778的博客 105

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

用Bundle传Bitmap图片

方法一: 在做项目中要实现将图片传到另外一个Activity中,利用利用bunble传值 1、Bitmap bitmap = null;Intent intent = new Intent();Bundle bundle = new Bundle();bundle.putParcelable("bitmap", bitmap);intent.putExtras( bundle); ...

weixin_30493321的博客 1194

Activity之间传递大数据问题

Android开发人员都知道,Intent适用于在不同的Activity之间传递数据,包括参数、字符串、以及序列化的对象等。但是笔者所做的项目用到了使用Intent 传递Bitmap图片对象,图片的数据量相对来说是比较大的,那么intent能否胜任传递图片的任务呢? 首先很明显bitmap实现了Android中的Parcelable接口,可以序列化。因此理所当然能够通过intent传递,然而图片

xiangzhihong8的专栏 4826

Intent、Bundle传递数据的那些秘密

一、Intent能传递多大的数据 1.1 大家都知道,通过intent是能够传递数据的,但是当传递的数据量过大是,会抛出TransactionTooLargeException的异常,这就证明我们用intent传递数据时,只能是一些很小的数据,以防应用崩溃。 1.2 安卓在TransactionTooLargeException异常的文档中,就已经进行了详细的说明。简单来说,是因为当使用Inten...

zzx752904457的博客 551
上一篇: Android进程间通信的几种方式
下一篇: android如何判断应用是否在前台
augfun
博客等级 码龄10年 311粉丝 662原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值