|
吾爱游客
发表于 2017-10-26 18:32
1.申请ID:三年千夜
2.个人邮箱:l_user@163.com
3.原创文章:本人是安卓开发,之前一直是个游客在吾爱看看资料,看看教程。最近才发现会员跟游客有那么大的差别,所以想试着申请一下会员。
以前看到别人微信朋友圈发送各种有趣视频,点赞无数,自己也想发一下然而又没有资源。偶然在网上发现了朋友圈转发他人视频的教程,教程步骤比较繁琐。作为一枚程序猿,做事情都要追求省事,于是根据教程,写了一个app。app的主要功能就是转发别人的朋友圈视频,操作简单。下面贴上核心代码,详细的解释一下原理:
1.其实核心的步骤就是监听微信文件夹,获取保存的朋友圈视频路径,自己发送朋友圈视频的时候,替换掉视频名字。这样就达到了发送别人朋友圈视频的目的。
2.android中有个FileObserver类,它的作用是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于linux的inotify。 通过它我们就可以实现监听视频的创建。代码如下:
继承FileObserver之后,重写onEvent
@Override
public void onEvent(int event, String path) {
// TODO Auto-generated method stub
switch(event) {
case FileObserver.ALL_EVENTS:
break;
case FileObserver.CREATE:
if (path.endsWith(".mp4")) {
Log.e("Create", "path:"+path);
if (SPutil.get(context, "wxpath", "").toString() != null) {
if (path.startsWith("tempvideo")) {//自己录制的视频
//得到转发的文件路径
File oldFile = new File(SPutil.get(context, "wxpath", "").toString()+"/"+path);
if (name != null) {
//得到自己录制的文件路径
File newFile = new File(SPutil.get(context, "wxpath", "").toString()+"/"+name);
if (newFile.exists()) {
oldFile.delete();//删除朋友圈视频
newFile.renameTo(oldFile);//重命名自己的视频
name = null;
}
}
}else {//转发的视频
File file = new File(SPutil.get(context, "wxpath", "").toString()+"/"+path);
if (file.exists()) {
name = path;
}
}
}
}
break;
case FileObserver.DELETE:
if (path.endsWith(".mp4")) {
}
break;
}
}
通过删除朋友圈视频,重命名自己的视频,这样达到替换文件的目的。
3.FileObserver需要一直保持一个引用来防止被java的GC干掉,于是我们需要创建一个service,在service中绑定使用。通过观察微信目录得知,登录了微信之后会在根目录“/tencent/MicroMsg/“中生成一个随机文件夹,保存当前用户的各种数据。因为随机文件夹的名字非常长,所以我们可以遍历 MicroMsg文件夹,得到最长文件夹的路径,进而进行监听。代码如下:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "服务被启动");
File file = new File(Environment.getExternalStorageDirectory().getPath()+"/tencent/MicroMsg/");
path = getAllFiles(file)+"/video";
SPutil.put(this, "wxpath", path);
if (mListner == null) {
mListner = new SDCardListener(FileService.this,path);
mListner.startWatching();
Log.e(TAG, "开启监听");
mNotificationManager.notify(100, mNotification);
}
return START_STICKY;
}
/**
*遍历指定的文件夹
*并且计算此文件夹下最长的文件夹名称
*/
private String getAllFiles(File root) {
String longFile = null;
File files[] = root.listFiles();
ArrayList<String> list = new ArrayList<String>();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {//表示这是一个目录
getAllFiles(f);
list.add(f.toString());
// Log.e(TAG, "文件夹:"+f);
} else {//表示这是一个文件
// Log.e(TAG, "文件夹:"+f);
}
}
}
String str = "1";
for (int i = 0; i < list.size(); i++) {
if (list.get(i).length() > str.length()) {
str = list.get(i);
}
}
if (!"1".equals(str)) {
longFile = str;
}
return longFile;
}
然而此方法有一个问题,多个用户登录之后会生成多个随机文件夹。我的思路是获取MicroMsg文件夹下所有长名称的文件夹,然后判断它们的最后修改时间,获取最接近当前时间的文件夹路径。
4.我们可以在activity中设置一个开关。启动或者停止service,这样就可以想转发就转发,不想转发的时候正常操作。
基本原理就是上面说的,排版上可能不太友好,希望能通过。
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|