Android代码集锦 SD卡相关

1. 检测Sdcard是否可用:

[java] view plain copy
  1. publicstaticbooleansdCardIsAvailable(){
  2. Stringstatus=Environment.getExternalStorageState();
  3. if(!status.equals(Environment.MEDIA_MOUNTED)){
  4. returnfalse;
  5. }
  6. returntrue;
  7. }

2.获得程序在sd卡上的cahce目录:

[java] view plain copy
  1. privatestaticbooleanhasExternalCacheDir(){
  2. returnBuild.VERSION.SDK_INT>=Build.VERSION_CODES.FROYO;
  3. }
  4. /**
  5. *@paramcontext上下文
  6. *@returnTheexternalcachedirSD卡路径
  7. */
  8. privatestaticStringgetExternalCacheDir(Contextcontext){
  9. //android2.2以后才支持的特性
  10. if(hasExternalCacheDir()){
  11. returncontext.getExternalCacheDir().getPath()+File.separator+"gesture";
  12. }
  13. //BeforeFroyoweneedtoconstructtheexternalcachedirourselves
  14. //2.2以前我们需要自己构造
  15. finalStringcacheDir="/Android/data/"+context.getPackageName()+"/cache/gesture/";
  16. returnEnvironment.getExternalStorageDirectory().getPath()+cacheDir;
  17. }

3. 获取Sdcard的实际空间大小:

[java] view plain copy
  1. publicstaticlonggetRealSizeOnSdcard(){
  2. Filepath=newFile(Environment.getExternalStorageDirectory().getAbsolutePath());
  3. StatFsstat=newStatFs(path.getPath());
  4. longblockSize=stat.getBlockSize();
  5. longavailableBlocks=stat.getAvailableBlocks();
  6. returnavailableBlocks*blockSize;
  7. }
-----> 检测 Sdcard 是否有足够的空间:

[java] view plain copy
  1. /**
  2. *@paramupdateSize指定的检测空间大小
  3. *@returnTrue空间足够返回true,不足返回false
  4. */
  5. publicstaticbooleanenoughSpaceOnSdCard(longupdateSize){
  6. Stringstatus=Environment.getExternalStorageState();
  7. if(!status.equals(Environment.MEDIA_MOUNTED))
  8. returnfalse;
  9. return(updateSize<getRealSizeOnSdcard());
  10. }

4. 获取手机的存储大小:

[java] view plain copy
  1. publicstaticlonggetRealSizeOnPhone(){
  2. Filepath=Environment.getDataDirectory();
  3. StatFsstat=newStatFs(path.getPath());
  4. longblockSize=stat.getBlockSize();
  5. longavailableBlocks=stat.getAvailableBlocks();
  6. longrealSize=blockSize*availableBlocks;
  7. returnrealSize;
  8. }
----> 检测手机存储 是否有足够的空间:

[java] view plain copy
  1. /**
  2. *@paramupdateSize指定的检测空间大小
  3. *@return空间足够返回true,不足返回false
  4. */
  5. publicstaticbooleanenoughSpaceOnPhone(longupdateSize){
  6. returngetRealSizeOnPhone()>updateSize;
  7. }

附带点很久之前的记忆小赠品:

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
  1. /**
  2. *@param位图
  3. *@return转化成的字符串
  4. */
  5. publicstaticStringbitmapToString(Bitmapbitmap){
  6. //将Bitmap转换成字符串
  7. Stringstring=null;
  8. ByteArrayOutputStreambStream=newByteArrayOutputStream();
  9. bitmap.compress(CompressFormat.PNG,100,bStream);
  10. byte[]bytes=bStream.toByteArray();
  11. string=Base64.encodeToString(bytes,Base64.DEFAULT);
  12. returnstring;
  13. }

2.字符串转化为Bitmap:

[java] view plain copy
  1. /**
  2. *@paramstring字符串
  3. *@return转化成的位图
  4. */
  5. publicstaticBitmapstringToBitmap(Stringstring){
  6. //将字符串转换成Bitmap类型
  7. Bitmapbitmap=null;
  8. try{
  9. byte[]bitmapArray;
  10. bitmapArray=Base64.decode(string,Base64.DEFAULT);
  11. bitmap=BitmapFactory.decodeByteArray(bitmapArray,0,bitmapArray.length);
  12. }catch(Exceptione){
  13. e.printStackTrace();
  14. }
  15. returnbitmap;
  16. }

3.Bitmap转化为Drawable:

[java] view plain copy
  1. /**
  2. *@parambitmapBitmap位图图像
  3. *@returnDrawable转换后的Drawable对象
  4. */
  5. publicstaticDrawablebitmapToDrawable(Bitmapbitmap){
  6. if(bitmap==null)
  7. returnnull;
  8. if(160!=bitmap.getDensity()){
  9. bitmap.setDensity(160);
  10. }
  11. returnnewBitmapDrawable(bitmap);
  12. }

根据图片资源ID获取Drawable对象:

[java] view plain copy
  1. /**
  2. *@paramcontext上下文
  3. *@paramid图片的资源ID
  4. *@returnDrawable对象
  5. */
  6. publicstaticDrawableresourceToDrawable(Contextcontext,intid){
  7. returnnull==context?null:bitmapToDrawable(BitmapFactory.decodeResource(context.getResources(),id));
  8. }

byte数组转换Drawble对象:

[java] view plain copy
  1. /**
  2. *@parambytesbyte数组
  3. *@returndrawble对象
  4. */
  5. publicstaticDrawablebyteArrayToDrawable(byte[]bytes){
  6. returnnull==bytes?null:bitmapToDrawable(BitmapFactory.decodeByteArray(bytes,0,bytes.length));
  7. }

4.Drawable转化为bitmap:

[java] view plain copy
  1. /**
  2. *Drawble对象转Bitmap对象
  3. *@paramdrawabledrawble对象
  4. *@returnbitmap对象
  5. */
  6. publicstaticBitmapdrawableToBitmap(Drawabledrawable){
  7. returnnull==drawable?null:((BitmapDrawable)drawable).getBitmap();
  8. }

5.byte数组转换Bitmap对象:

[java] view plain copy
  1. /**
  2. *@parambytesbyte数组
  3. *@returnbitmap对象
  4. */
  5. publicstaticBitmapbyteArrayToBitmap(byte[]bytes){
  6. returnnull==bytes?null:BitmapFactory.decodeByteArray(bytes,0,bytes.length);
  7. }

6.图片去色,返回灰度图片(老式图片):
[java] view plain copy
  1. /**
  2. *@parambitmap传入的bitmap
  3. *@return去色后的图片Bitmap对象
  4. */
  5. publicstaticBitmaptoGrayscale(Bitmapbitmap){
  6. intwidth,height;
  7. height=bitmap.getHeight();
  8. width=bitmap.getWidth();
  9. BitmapbmpGrayscale=Bitmap.createBitmap(width,height,Bitmap.Config.RGB_565);
  10. Canvasc=newCanvas(bmpGrayscale);
  11. Paintpaint=newPaint();
  12. ColorMatrixcm=newColorMatrix();
  13. cm.setSaturation(0);
  14. ColorMatrixColorFilterf=newColorMatrixColorFilter(cm);
  15. paint.setColorFilter(f);
  16. c.drawBitmap(bitmap,0,0,paint);
  17. returnbmpGrayscale;
  18. }

7.对图片进行缩放:

[java] view plain copy
  1. /**
  2. *@paramurl图片的路径
  3. *@paramrequireSize缩放的尺寸
  4. *@return缩放后的图片Bitmap对象
  5. */
  6. publicstaticBitmapgetScaleImage(Stringurl,intrequireSize){
  7. BitmapFactory.Optionso=newBitmapFactory.Options();
  8. //此属性表示图片不加载到内存,只是读取图片的属性,包括图片的高宽
  9. o.inJustDecodeBounds=true;
  10. BitmapFactory.decodeFile(url,o);
  11. intwidth_tmp=o.outWidth,height_tmp=o.outHeight;
  12. intscale=1;
  13. while(true){
  14. if(width_tmp/2<requireSize||height_tmp/2<requireSize)
  15. break;
  16. width_tmp/=2;
  17. height_tmp/=2;
  18. scale*=2;
  19. }
  20. BitmapFactory.Optionso2=newBitmapFactory.Options();
  21. o2.inSampleSize=scale;
  22. Bitmapbmp=BitmapFactory.decodeFile(url,o2);
  23. returnbmp;
  24. }

8.获得图片的倒影,同时倒影渐变效果:

[java] view plain copy
  1. /**
  2. *@parambitmap图片源
  3. *@return处理后的图片Bitmap对象
  4. */
  5. publicstaticBitmapcreateMirro(Bitmapbitmap){
  6. intwidth=bitmap.getWidth();
  7. intheight=bitmap.getHeight();
  8. intshadow_height=15;
  9. int[]pixels=newint[width*height];
  10. bitmap.getPixels(pixels,0,width,0,0,width,height);
  11. //shadoweffect
  12. intalpha=0x00000000;
  13. for(inty=0;y<height;y++){
  14. for(intx=0;x<width;x++){
  15. intindex=y*width+x;
  16. intr=(pixels[index]>>16)&0xff;
  17. intg=(pixels[index]>>8)&0xff;
  18. intb=pixels[index]&0xff;
  19. pixels[index]=alpha|(r<<16)|(g<<8)|b;
  20. }
  21. if(y>=(height-shadow_height)){
  22. alpha=alpha+0x1F000000;
  23. }
  24. }
  25. //inverteffect
  26. Bitmapbm=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
  27. for(inty=0;y<height;y++){
  28. bm.setPixels(pixels,y*width,width,0,height-y-1,width,1);
  29. }
  30. returnBitmap.createBitmap(bm,0,0,width,shadow_height);
  31. }

9.保存图片到SDCard:

[java] view plain copy
  1. /**
  2. *@paramimagePath图片保存路径
  3. *@parambm被保存的bitmap对象
  4. */
  5. publicstaticvoidsaveImgToLocal(StringimagePath,Bitmapbm){
  6. if(bm==null||imagePath==null||"".equals(imagePath)){
  7. return;
  8. }
  9. Filef=newFile(imagePath);
  10. if(f.exists()){
  11. return;
  12. }else{
  13. try{
  14. FileparentFile=f.getParentFile();
  15. if(!parentFile.exists()){
  16. parentFile.mkdirs();
  17. }
  18. f.createNewFile();
  19. FileOutputStreamfos;
  20. fos=newFileOutputStream(f);
  21. bm.compress(Bitmap.CompressFormat.PNG,100,fos);
  22. fos.close();
  23. }catch(FileNotFoundExceptione){
  24. f.delete();
  25. e.printStackTrace();
  26. }catch(IOExceptione){
  27. e.printStackTrace();
  28. f.delete();
  29. }
  30. }
  31. }

10.从SDCard中获取图片:

[java] view plain copy
  1. /**
  2. *@paramimagePath图片在SDCard中保存的路径
  3. *@return返回保存的bitmap对象
  4. */
  5. publicstaticBitmapgetImageFromLocal(StringimagePath){
  6. Filefile=newFile(imagePath);
  7. if(file.exists()){
  8. Bitmapbitmap=BitmapFactory.decodeFile(imagePath);
  9. file.setLastModified(System.currentTimeMillis());
  10. returnbitmap;
  11. }
  12. returnnull;
  13. }

11.图片压缩处理:

[java] view plain copy
  1. /**
  2. *对图片进行压缩,主要是为了解决控件显示过大图片占用内存造成OOM问题。
  3. *一般压缩后的图片大小应该和用来展示它的控件大小相近。
  4. *@paramcontext上下文
  5. *@paramresId图片资源Id
  6. *@paramreqWidth期望压缩的宽度
  7. *@paramreqHeight期望压缩的高度
  8. *@return压缩后的图片
  9. */
  10. publicstaticBitmapcompressBitmapFromResourse(Contextcontext,intresId,intreqWidth,intreqHeight){
  11. finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();
  12. /*
  13. *第一次解析时,inJustDecodeBounds设置为true,
  14. *禁止为bitmap分配内存,虽然bitmap返回值为空,但可以获取图片大小
  15. */
  16. options.inJustDecodeBounds=true;
  17. BitmapFactory.decodeResource(context.getResources(),resId,options);
  18. finalintheight=options.outHeight;
  19. finalintwidth=options.outWidth;
  20. intinSampleSize=1;
  21. if(height>reqHeight||width>reqWidth){
  22. finalintheightRatio=Math.round((float)height/(float)reqHeight);
  23. finalintwidthRatio=Math.round((float)width/(float)reqWidth);
  24. inSampleSize=heightRatio<widthRatio?heightRatio:widthRatio;
  25. }
  26. options.inSampleSize=inSampleSize;
  27. //使用计算得到的inSampleSize值再次解析图片
  28. options.inJustDecodeBounds=false;
  29. returnBitmapFactory.decodeResource(context.getResources(),resId,options);
  30. }


12.获取可用内存的最大值(App使用内存超出这个值会引起OutOfMemory异常):

[java] view plain copy
  1. privateintgetMaxMemoryForApp(){
  2. intmaxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
  3. returnmaxMemory;
  4. }




更多相关文章

  1. 在TextView上显示图片信息
  2. 在android中实现两张图片对比
  3. Android 获取网络图片方法
  4. android 字符串转换成JSON对象
  5. android图片缩放(指定大小) drawable获取图片后怎么设置图片大小
  6. Android调用相机拍照并返回路径和调用系统图库选择图片
  7. Android中Intent传递对象的两种方法:Serializable & Parcelable
  8. [android]简单方法记载 在adapter中异步加载网络图片
  9. android打开,保存图片到sd卡,显示图片

随机推荐

  1. Android EditText插入字符串到光标所在位
  2. Android 指定(后缀名)格式文件扫描
  3. android中的colors.xml
  4. Android实用图片显示控件photoview
  5. android边学边记——Demo_sms
  6. Android 手势滑动动画效果收集整理
  7. Could not find bundletool.jar
  8. android 中文权限解释
  9. Android实现二级列表购物车功能
  10. Android(安卓)Kiosk 模式