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" />

 

 

然后 ,发布,运行,感觉好棒啊 ,哈哈

 

posted @ 2013-10-31 23:41  小菜小白  阅读(1359)  评论(0编辑  收藏  举报