Android代码总结,Sdcard和图片相关
Android代码集锦 SD卡相关
1. 检测Sdcard是否可用:
[java] view plain copy
- publicstaticbooleansdCardIsAvailable(){
- Stringstatus=Environment.getExternalStorageState();
- if(!status.equals(Environment.MEDIA_MOUNTED)){
- returnfalse;
- }
- returntrue;
- }
2.获得程序在sd卡上的cahce目录:
[java] view plain copy
- privatestaticbooleanhasExternalCacheDir(){
- returnBuild.VERSION.SDK_INT>=Build.VERSION_CODES.FROYO;
- }
- /**
- *@paramcontext上下文
- *@returnTheexternalcachedirSD卡路径
- */
- privatestaticStringgetExternalCacheDir(Contextcontext){
- //android2.2以后才支持的特性
- if(hasExternalCacheDir()){
- returncontext.getExternalCacheDir().getPath()+File.separator+"gesture";
- }
- //BeforeFroyoweneedtoconstructtheexternalcachedirourselves
- //2.2以前我们需要自己构造
- finalStringcacheDir="/Android/data/"+context.getPackageName()+"/cache/gesture/";
- returnEnvironment.getExternalStorageDirectory().getPath()+cacheDir;
- }
3. 获取Sdcard的实际空间大小:
[java] view plain copy
- publicstaticlonggetRealSizeOnSdcard(){
- Filepath=newFile(Environment.getExternalStorageDirectory().getAbsolutePath());
- StatFsstat=newStatFs(path.getPath());
- longblockSize=stat.getBlockSize();
- longavailableBlocks=stat.getAvailableBlocks();
- returnavailableBlocks*blockSize;
- }
[java] view plain copy
- /**
- *@paramupdateSize指定的检测空间大小
- *@returnTrue空间足够返回true,不足返回false
- */
- publicstaticbooleanenoughSpaceOnSdCard(longupdateSize){
- Stringstatus=Environment.getExternalStorageState();
- if(!status.equals(Environment.MEDIA_MOUNTED))
- returnfalse;
- return(updateSize<getRealSizeOnSdcard());
- }
4. 获取手机的存储大小:
[java] view plain copy
- publicstaticlonggetRealSizeOnPhone(){
- Filepath=Environment.getDataDirectory();
- StatFsstat=newStatFs(path.getPath());
- longblockSize=stat.getBlockSize();
- longavailableBlocks=stat.getAvailableBlocks();
- longrealSize=blockSize*availableBlocks;
- returnrealSize;
- }
[java] view plain copy
- /**
- *@paramupdateSize指定的检测空间大小
- *@return空间足够返回true,不足返回false
- */
- publicstaticbooleanenoughSpaceOnPhone(longupdateSize){
- returngetRealSizeOnPhone()>updateSize;
- }
附带点很久之前的记忆小赠品:
1. 在Android.mk中加入LOCAL_CERTIFICATE := platform就可以使用系统隐藏api(@hide)。
2.Activity的启动模式总结:
1). standard:
堆栈(task):与应用程序的其他已启动过的Activity在同一个堆栈
实例创建:每次启动都会创建新的实例
2). singleTop:
堆栈(task):与应用程序的其他已启动过的Activity在同一个堆栈
实例创建:启动时,检查是否有该Activity的实例在当前的栈顶(启动过的记录)。若有,则不再创建新实例,若无,则重新创建新实例,置于栈顶。
3). singleTask:
堆栈(task): 与应用程序的其他已启动过的Activity在同一个堆栈
实例创建:启动时,检查task中是否有该Activity的实例。若有,则将task中在该Activity实例之上的所有其他Activity实例统统出栈(pop),
使其在栈顶。若无,则重新创建该Activity实例,置于栈顶。
4). singleInstance:
堆栈(task):与另外其他三种模式不同,会新建一个task,将Acitvity放置于这个新的task中,并保证不再有其他Activity实例进入.
实例创建:第一次创建时,会新建一个task,将其至于新的task中。若实例已存在,在启动时,无需再创建新实例,复用之前已创建的实例。
3.设置Activity的背景为手机桌面的背景:
在setContentView方法之前添加getWindow().setFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER),
然后在AndroidManifest.xml文件中添加android:theme="@android:style/Theme.Translucent"属性,实现将该Activity设置为透明。
4.查看手机内存空间代码long freeMemory = Runtime.getRuntime().freeMemory();
5.关于Android主线程:
android中的主线程是UI线程,它是针对android中的UI组件操作的线程,而android中UI组件操作要求是非线程安全的,
毕竟UI组件的更新操作要求快速响应,如果更新时考虑线程安全,同步锁等待响应之类的,那么UI组件的更新响应就有可能会延迟,
这样话就不符合Android要求尽可能规避的ANR异常。
6.Android4.4系统发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题。
7. 引用相关:
SoftReference<T>:软引用-->当虚拟机内存不足时,将会回收它指向的对象;需要获取对象时,可以调用get方法。
WeakReference<T>:弱引用-->随时可能会被垃圾回收器回收。
softReference多用作来实现cache机制,weakReference一般用来防止内存泄漏,要保证内存被VM回收 .
8.TCP和UDP
由于面向连接的TCP协议在发生数据丢包时,会要求重传,这会
影响视频的实时性。UDP由于其是面向事务的,且简单不可靠的传输协议,
在传输视频数据当中具有快捷,消耗资源小的特点,简单的传输过程中产生的
丢包和乱序是可以在视频接收端处理的。所以一般采用UDP协议作为多媒体通信的传输层协议。
9.内存相关:
1). 一个进程的内存可以由2个部分组成:java 使用内存 ,C 使用内存 ,
这两个内存的和必须小于16M(16M是怎么来的?算是实验来的吧,每个机型不一样,模拟器不同版本也不一样,可以通过:
Runtime.getMaxMemory() 来查看。),不然就会出现大家熟悉的OOM,这个就是第一种OOM的情况。
2). 更加奇怪的是这个:一旦内存分配给Java后,以后这块内存即使释放后,也只能给Java的使用,这个估计跟java虚拟机里把内存分成好几块进行缓存的原因有关,反正C就别想用到这块的内存了。
Android代码集锦 图片处理相关
1. Bitmap转化为字符串:
[java] view plain copy
- /**
- *@param位图
- *@return转化成的字符串
- */
- publicstaticStringbitmapToString(Bitmapbitmap){
- //将Bitmap转换成字符串
- Stringstring=null;
- ByteArrayOutputStreambStream=newByteArrayOutputStream();
- bitmap.compress(CompressFormat.PNG,100,bStream);
- byte[]bytes=bStream.toByteArray();
- string=Base64.encodeToString(bytes,Base64.DEFAULT);
- returnstring;
- }
2.字符串转化为Bitmap:
[java] view plain copy
- /**
- *@paramstring字符串
- *@return转化成的位图
- */
- publicstaticBitmapstringToBitmap(Stringstring){
- //将字符串转换成Bitmap类型
- Bitmapbitmap=null;
- try{
- byte[]bitmapArray;
- bitmapArray=Base64.decode(string,Base64.DEFAULT);
- bitmap=BitmapFactory.decodeByteArray(bitmapArray,0,bitmapArray.length);
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnbitmap;
- }
3.Bitmap转化为Drawable:
[java] view plain copy- /**
- *@parambitmapBitmap位图图像
- *@returnDrawable转换后的Drawable对象
- */
- publicstaticDrawablebitmapToDrawable(Bitmapbitmap){
- if(bitmap==null)
- returnnull;
- if(160!=bitmap.getDensity()){
- bitmap.setDensity(160);
- }
- returnnewBitmapDrawable(bitmap);
- }
根据图片资源ID获取Drawable对象:
[java] view plain copy
- /**
- *@paramcontext上下文
- *@paramid图片的资源ID
- *@returnDrawable对象
- */
- publicstaticDrawableresourceToDrawable(Contextcontext,intid){
- returnnull==context?null:bitmapToDrawable(BitmapFactory.decodeResource(context.getResources(),id));
- }
byte数组转换Drawble对象:
[java] view plain copy
- /**
- *@parambytesbyte数组
- *@returndrawble对象
- */
- publicstaticDrawablebyteArrayToDrawable(byte[]bytes){
- returnnull==bytes?null:bitmapToDrawable(BitmapFactory.decodeByteArray(bytes,0,bytes.length));
- }
4.Drawable转化为bitmap:
[java] view plain copy
- /**
- *Drawble对象转Bitmap对象
- *@paramdrawabledrawble对象
- *@returnbitmap对象
- */
- publicstaticBitmapdrawableToBitmap(Drawabledrawable){
- returnnull==drawable?null:((BitmapDrawable)drawable).getBitmap();
- }
5.byte数组转换Bitmap对象:
[java] view plain copy
- /**
- *@parambytesbyte数组
- *@returnbitmap对象
- */
- publicstaticBitmapbyteArrayToBitmap(byte[]bytes){
- returnnull==bytes?null:BitmapFactory.decodeByteArray(bytes,0,bytes.length);
- }
6.图片去色,返回灰度图片(老式图片):
[java] view plain copy
- /**
- *@parambitmap传入的bitmap
- *@return去色后的图片Bitmap对象
- */
- publicstaticBitmaptoGrayscale(Bitmapbitmap){
- intwidth,height;
- height=bitmap.getHeight();
- width=bitmap.getWidth();
- BitmapbmpGrayscale=Bitmap.createBitmap(width,height,Bitmap.Config.RGB_565);
- Canvasc=newCanvas(bmpGrayscale);
- Paintpaint=newPaint();
- ColorMatrixcm=newColorMatrix();
- cm.setSaturation(0);
- ColorMatrixColorFilterf=newColorMatrixColorFilter(cm);
- paint.setColorFilter(f);
- c.drawBitmap(bitmap,0,0,paint);
- returnbmpGrayscale;
- }
7.对图片进行缩放:
[java] view plain copy- /**
- *@paramurl图片的路径
- *@paramrequireSize缩放的尺寸
- *@return缩放后的图片Bitmap对象
- */
- publicstaticBitmapgetScaleImage(Stringurl,intrequireSize){
- BitmapFactory.Optionso=newBitmapFactory.Options();
- //此属性表示图片不加载到内存,只是读取图片的属性,包括图片的高宽
- o.inJustDecodeBounds=true;
- BitmapFactory.decodeFile(url,o);
- intwidth_tmp=o.outWidth,height_tmp=o.outHeight;
- intscale=1;
- while(true){
- if(width_tmp/2<requireSize||height_tmp/2<requireSize)
- break;
- width_tmp/=2;
- height_tmp/=2;
- scale*=2;
- }
- BitmapFactory.Optionso2=newBitmapFactory.Options();
- o2.inSampleSize=scale;
- Bitmapbmp=BitmapFactory.decodeFile(url,o2);
- returnbmp;
- }
8.获得图片的倒影,同时倒影渐变效果:
[java] view plain copy- /**
- *@parambitmap图片源
- *@return处理后的图片Bitmap对象
- */
- publicstaticBitmapcreateMirro(Bitmapbitmap){
- intwidth=bitmap.getWidth();
- intheight=bitmap.getHeight();
- intshadow_height=15;
- int[]pixels=newint[width*height];
- bitmap.getPixels(pixels,0,width,0,0,width,height);
- //shadoweffect
- intalpha=0x00000000;
- for(inty=0;y<height;y++){
- for(intx=0;x<width;x++){
- intindex=y*width+x;
- intr=(pixels[index]>>16)&0xff;
- intg=(pixels[index]>>8)&0xff;
- intb=pixels[index]&0xff;
- pixels[index]=alpha|(r<<16)|(g<<8)|b;
- }
- if(y>=(height-shadow_height)){
- alpha=alpha+0x1F000000;
- }
- }
- //inverteffect
- Bitmapbm=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
- for(inty=0;y<height;y++){
- bm.setPixels(pixels,y*width,width,0,height-y-1,width,1);
- }
- returnBitmap.createBitmap(bm,0,0,width,shadow_height);
- }
9.保存图片到SDCard:
[java] view plain copy
- /**
- *@paramimagePath图片保存路径
- *@parambm被保存的bitmap对象
- */
- publicstaticvoidsaveImgToLocal(StringimagePath,Bitmapbm){
- if(bm==null||imagePath==null||"".equals(imagePath)){
- return;
- }
- Filef=newFile(imagePath);
- if(f.exists()){
- return;
- }else{
- try{
- FileparentFile=f.getParentFile();
- if(!parentFile.exists()){
- parentFile.mkdirs();
- }
- f.createNewFile();
- FileOutputStreamfos;
- fos=newFileOutputStream(f);
- bm.compress(Bitmap.CompressFormat.PNG,100,fos);
- fos.close();
- }catch(FileNotFoundExceptione){
- f.delete();
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- f.delete();
- }
- }
- }
10.从SDCard中获取图片:
[java] view plain copy
- /**
- *@paramimagePath图片在SDCard中保存的路径
- *@return返回保存的bitmap对象
- */
- publicstaticBitmapgetImageFromLocal(StringimagePath){
- Filefile=newFile(imagePath);
- if(file.exists()){
- Bitmapbitmap=BitmapFactory.decodeFile(imagePath);
- file.setLastModified(System.currentTimeMillis());
- returnbitmap;
- }
- returnnull;
- }
11.图片压缩处理:
[java] view plain copy
- /**
- *对图片进行压缩,主要是为了解决控件显示过大图片占用内存造成OOM问题。
- *一般压缩后的图片大小应该和用来展示它的控件大小相近。
- *@paramcontext上下文
- *@paramresId图片资源Id
- *@paramreqWidth期望压缩的宽度
- *@paramreqHeight期望压缩的高度
- *@return压缩后的图片
- */
- publicstaticBitmapcompressBitmapFromResourse(Contextcontext,intresId,intreqWidth,intreqHeight){
- finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
- /*
- *第一次解析时,inJustDecodeBounds设置为true,
- *禁止为bitmap分配内存,虽然bitmap返回值为空,但可以获取图片大小
- */
- options.inJustDecodeBounds=true;
- BitmapFactory.decodeResource(context.getResources(),resId,options);
- finalintheight=options.outHeight;
- finalintwidth=options.outWidth;
- intinSampleSize=1;
- if(height>reqHeight||width>reqWidth){
- finalintheightRatio=Math.round((float)height/(float)reqHeight);
- finalintwidthRatio=Math.round((float)width/(float)reqWidth);
- inSampleSize=heightRatio<widthRatio?heightRatio:widthRatio;
- }
- options.inSampleSize=inSampleSize;
- //使用计算得到的inSampleSize值再次解析图片
- options.inJustDecodeBounds=false;
- returnBitmapFactory.decodeResource(context.getResources(),resId,options);
- }
12.获取可用内存的最大值(App使用内存超出这个值会引起OutOfMemory异常):
[java] view plain copy
- privateintgetMaxMemoryForApp(){
- intmaxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
- returnmaxMemory;
- }
更多相关文章
- 在TextView上显示图片信息
- 在android中实现两张图片对比
- Android 获取网络图片方法
- android 字符串转换成JSON对象
- android图片缩放(指定大小) drawable获取图片后怎么设置图片大小
- Android调用相机拍照并返回路径和调用系统图库选择图片
- Android中Intent传递对象的两种方法:Serializable & Parcelable
- [android]简单方法记载 在adapter中异步加载网络图片
- android打开,保存图片到sd卡,显示图片