Android Service监听SD卡某目录变化,并获取文件Path

来源:互联网 发布:光的矩阵盒 无光之海 编辑:程序博客网 时间:2024/05/21 07:51

最近做项目要写一个Service 监听SD卡的一个服务。其过程如下:

这东西,真是费了我一天功夫。。分享给需要的朋友们。

开机启动:BraodCast-->Service-->Activity,应用安装一次就够了,他会一直在后台运行,即便是被手机

清除。

在网上看了写关于监听SD卡目录变化的资料:

http://blog.csdn.net/sqk1988/article/details/7756507

http://www.eoeandroid.com/thread-184121-1-1.html

http://wenku.baidu.com/view/43ec352658fb770bf78a55a0.html

http://www.oschina.net/question/138715_19250

需要的朋友可以做做参考:

好了,下面就贴出源码:

首先,BroadCast在,AndroidManifest.xml注册:这大家都会就不做解释了。只要在xml里面设置Broadcast开机启动权限就OK.

<action android:name="android.intent.action.BOOT_COMPLETED" />

2.实现onReceive()方法;

代码:

public class ClientReciver extends BroadcastReceiver {

static final String ACTION="android.intent.action.BOOT_COMPLETED";

public void onReceive( Context context, Intent intent) {
  //判断手机是否开机,开机则启动Activity
  if (intent.getAction().equals(ACTION))
    {
     Intent i=new Intent(context,ClientService.class);
     context.startService(i);
     Log.i("TAG", "开机启动。。。");
     System.out.println("广播开始..");}

}

}

触发Service,我需要在Service里做一些监听事情.在监听SD卡目录之前,Android为我们提供了一个已经封装的public abstract class FileObserver抽象类,实现里面的方法OnEvent();

代码:

public class PackageReads extends FileObserver {
 private String filepath=null;
 private Handler loginHandler;
 
 public PackageReads(String path, Handler loginHandler) {
  super(path);
  this.loginHandler= loginHandler;
  filepath=path;
 }
 public Handler getLoginHandler() {
  return loginHandler;
 }

 public void setLoginHandler(Handler loginHandler) {
  this.loginHandler = loginHandler;
 }

 public PackageReads(String path) {
  super(path);

 }

 public void onEvent(int event, String path) 
 {
  String date="";
  if(filepath!=null && path!=null)
  {
  switch (event) {
  // 文件被创建
  case FileObserver.CREATE:
   Log.d("all", "path:" + path);
   date=filepath+path;
   Message msg = new Message();
   msg.obj = date;
   loginHandler.sendMessage(msg);
   break;
  default:
   break;
  }
   }
 }

}

3.准备就绪,我们在Service里面看看结果:OnCreate(),OnStart()做操作

我在这里对手机SD卡"/mnt/sdcard/androidfiletest/"做了监听处理.
 public void onStart(Intent intent, int startId) {
  super.onStart(intent, startId);
  Log.i("onStart...", "ServiceonStart...");
  new Thread(){
   int date=0;
   public void run() {
    if (packagelistener == null) {
     packagelistener = new PackageReads("/mnt/sdcard/androidfiletest/",
       loginHandler);
     packagelistener.startWatching();
        }
   };
  }.start();

在OnCreate  内来获取传入文件信息:

public void onCreate() {
  super.onCreate();
  Log.i("onCreate()...", "ServiceonCreate()...");
  notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  Toast.makeText(ClientService.this, "Service启动..", 1).show();


    showNotification();
  // timer = new Timer(false);


  loginHandler = new Handler() {
   public void handleMessage(Message msg) {
    super.handleMessage(msg);
    datapath = (String) msg.obj;
    if(datapath!=null)
    {
     Toast.makeText(getApplicationContext(),
       "发现Pgc文件" + datapath, 1).show();

  //将获取的文件路径,传送到Activity中,这里用的Bundle
     Intent filepath=new Intent(ClientService.this,ListViewWebView.class);
     Bundle b=new Bundle();
     b.putString("path", datapath);
     filepath.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     //filepath.putExtra("path", datapath);
     System.out.println("datapath="+datapath);
     filepath.putExtras(b);
     startActivity(filepath);
    }
   }
  };
 
 }

Activity代码:

Bundle b=new Bundle();
  b=getIntent().getExtras();
  result=b.getString("path");
  //result=getIntent().getStringExtra("path");
  System.out.println("result=="+result);

运行效果:

这里只针对监听SD卡androidfiletest目录的操作,所以代码只是这部分的希望大家不要介意,真心的希望能对大家有所帮助。

0 0
原创粉丝点击