Android遍历sd卡下面的文件夹中的图片并且循环播放
本人学生一名,开始学习android时间不长,再加上没有太多的时间去写,水平一般,请见谅
前一段时间,老师要求要写出来一个应用在android电视上使用,展示我们实验室团队的一些作品,然后,临危受命,文件操作是第一次写,表示很蛋疼
好了闲话不多说,先贴代码
1 import java.io.BufferedInputStream; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.util.ArrayList; 6 7 import android.app.Activity; 8 import android.graphics.Bitmap; 9 import android.graphics.BitmapFactory; 10 import android.os.Build; 11 import android.os.Build.VERSION; 12 import android.os.Build.VERSION_CODES; 13 import android.os.Bundle; 14 import android.os.Environment; 15 import android.view.GestureDetector; 16 import android.view.MotionEvent; 17 import android.view.ViewGroup.LayoutParams; 18 import android.view.Window; 19 import android.view.WindowManager; 20 import android.widget.ImageView; 21 import android.widget.Toast; 22 import android.widget.ViewFlipper; 23 24 public class ViewFlipperActivity extends Activity implements 25 android.view.GestureDetector.OnGestureListener { 26 27 private ViewFlipper viewFlipper = null; 28 public String FileDir = null; 29 public int counter = 0; 30 public Bitmap[] bitmap_jj = new Bitmap[100]; 31 32 @Override 33 public void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 36 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 37 WindowManager.LayoutParams.FLAG_FULLSCREEN); //这个貌似没有意义 38 setContentView(R.layout.main); 39 closeBar(); 40 viewFlipper = (ViewFlipper) findViewById(R.id.viewflipper); 41 new GestureDetector(this); 42 SavaBitmap(); 43 for (int i = 0; i < counter; i++) { 44 System.out.println(i); 45 ImageView iv = new ImageView(this); // 在ViewFlipper中插入ImagineView 46 iv.setImageBitmap(bitmap_jj[i]); 47 iv.setScaleType(ImageView.ScaleType.FIT_XY); 48 viewFlipper.addView(iv, new LayoutParams(LayoutParams.FILL_PARENT, 49 LayoutParams.FILL_PARENT)); 50 } 51 viewFlipper.setAutoStart(true); //设置自动播放 52 viewFlipper.setFlipInterval(10000); 53 if (viewFlipper.isAutoStart() && !viewFlipper.isFlipping()) { 54 viewFlipper.startFlipping(); 55 } 56 } 57 58 @Override 59 public boolean onDown(MotionEvent e) { 60 return false; 61 } 62 63 @Override 64 public void onLongPress(MotionEvent e) { 65 } 66 67 @Override 68 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 69 float distanceY) { 70 return false; 71 } 72 73 @Override 74 public void onShowPress(MotionEvent e) { 75 } 76 77 @Override 78 public boolean onSingleTapUp(MotionEvent e) { 79 return false; 80 } 81 82 @Override 83 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 84 float velocityY) { 85 // TODO Auto-generated method stub 86 return false; 87 } 88 89 private String isSdcard() { //判断sd卡知否存在并且得到sd卡的目录 90 File sdcardDir = null; 91 boolean isSDExist = Environment.getExternalStorageState().equals( 92 Environment.MEDIA_MOUNTED); 93 if (isSDExist) { 94 // 如果存在SDcard 就找到跟目录 95 sdcardDir = Environment.getExternalStorageDirectory(); 96 97 return sdcardDir.toString(); 98 } else { 99 return null; 100 } 101 } 102 //这个函数的存在的是因为在android电视上会有一个不能隐藏的操作栏 103 //这个方法是百度来的,意义在于隐藏下面的那一条操作栏,但是仅限于在root的设备上使用 104 private void closeBar() { 105 try { 106 new Build.VERSION_CODES(); 107 new Build.VERSION(); 108 String ProcID = "79"; 109 110 if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) { 111 ProcID = "42"; // ICS AND NEWER 112 } 113 114 // 需要root 权限 115 Process proc = Runtime.getRuntime().exec( 116 new String[] { 117 "su", 118 "-c", 119 "service call activity " + ProcID 120 + " s16 com.android.systemui" }); // WAS 79 121 proc.waitFor(); 122 123 } catch (Exception ex) { 124 Toast.makeText(getApplicationContext(), ex.getMessage(), 125 Toast.LENGTH_LONG).show(); 126 } 127 } 128 //这是显示操作栏的方法 129 private void showBar() { 130 try { 131 Process proc = Runtime.getRuntime().exec( 132 new String[] { "am", "startservice", "-n", 133 "com.android.systemui/.SystemUIService" }); 134 proc.waitFor(); 135 } catch (Exception e) { 136 e.printStackTrace(); 137 } 138 } 139 //遍历目录下的图片文件,然后,存储在BitMap数组中, 140 private void SavaBitmap() { 141 File file_ = new File(isSdcard() + "/OurMM/"); 142 File[] files = file_.listFiles(); 143 if (files != null) { 144 int count = files.length; 145 System.out.println(count); 146 for (int i = 0; i < count; i++) { 147 File file = files[i]; 148 String filepath = file.getAbsolutePath(); //得到路径 149 if (filepath.endsWith("jpg") || filepath.endsWith("gif") 150 || filepath.endsWith("bmp") || filepath.endsWith("png")) { 151 ArrayList<String> myFilePath = new ArrayList<String>();//吧路径存入容器中 152 myFilePath.add(file.getName()); 153 System.out.println("size is " + myFilePath.size()); 154 for (int j = 0; j < myFilePath.size(); j++) { //本来是用foreach的方式遍历,发现那样所有的字符都会一次性输出 155 String ll = myFilePath.get(j); 156 System.out.println(ll); 157 FileInputStream fis = null; 158 try { 159 fis = new FileInputStream(isSdcard() + "/OurMM/" //ll中只有文件名,没有路径,坑了我很久,然后输出日志才突然发现原因所在 160 + ll); 161 } catch (FileNotFoundException e) { 162 // TODO Auto-generated catch block 163 System.out.println("error"); 164 e.printStackTrace(); 165 } 166 BufferedInputStream bis = new BufferedInputStream(fis); //把路径中的图片读出来 转化为bitmap并且放入数组中 167 Bitmap bitmap = BitmapFactory.decodeStream(bis); 168 bitmap_jj[counter] = bitmap; 169 counter++; 170 } 171 172 } 173 } 174 } 175 } 176 }
然后,其实有好几个地方困扰了好久,图片不显示(后来证明是应为我获得的读取图片用的路径只有图片名,没有地址)之类的,都是通过 System.out.println()的方法发现的, 事实证明在android开发中,输出日志还是很有用的,有bug可以通过输出变量来查看,真心觉得这个很有用。
然后 这个是我的布局文件 ,非常简单
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <ViewFlipper 8 android:id="@+id/viewflipper" 9 android:layout_width="fill_parent" 10 android:layout_height="fill_parent"/> 11 12 </LinearLayout>
最后,访问sd卡 ,千万别忘记在manifest里面添加sd卡的访问权限啊
1 <uses-permission android:name="android.permission.INTERNET" /> 2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
然后 ,发布,运行,感觉好棒啊 ,哈哈