Android-启动时运行服务,无活动
问题是: 在Android中,似乎没有办法指定DCIM文件夹中您希望同步到云的各个文件夹。Facebook应用程序将图像保存到DCIM/Facebook,因此我保存的任何图像都会自动同步到云。我可以通过在文件夹中放置一个.NOMEDIA文件来解决这个问题,但现在这意味着如果不进入文件资源管理器,我就无法浏览这些文件,因此我无法轻松地在邮件中发送这些图像 目前我正在开发一个Android应用程序,它可以自动将文件(而不是.NOMDEIA文件)从DCIM/Facebook移动到Pictures/Facebook。我目前在MainActivity类中有这样做的代码,我希望将其转换为自动运行的服务 简言之,我希望这个服务在启动时启动,并且总是在不显示活动的情况下运行,这样就省去了我的任何手动工作。同样,我不想手动启动任何东西,我认为没有必要进行活动,因为我不想进行任何用户交互。我已经阅读了很多页面,在文档中迷失了方向,并且浏览了无数关于服务、IntentService、JobScheduler等的帖子。目前,我正在对实现和正确方法进行研究 对于每隔几秒钟运行一次的作业计划来说,这是一个很好的例子吗?它是否应该是一个在循环中反复运行代码的服务,该循环在每次迭代中等待几秒钟?是否可以在文件夹中添加内容时触发服务 如上所述,我一直在努力实现。此时,我唯一能做的就是从MainActivity内部调用服务,但这是在活动短暂打开和关闭时发生的。这是不受欢迎的行为。在这一点上,事情变得有点混乱,所以我选择不包含任何代码,希望有人能给我指出正确的文档/教程,或者提供一个适合我使用的框架。我不想从一开始就把水弄脏 重要注意事项:我对活动的实现请求对读取\ u外部\ u存储的权限(我的理解是,您不需要请求对写入\ u外部\ u存储的权限;我的代码在未请求该权限的情况下工作)但我也不确定如何确保为服务执行此操作,因为请求权限的方法似乎希望将活动作为参数之一 编辑:为接收方和服务添加清单和代码 FacebookImageListener.javaAndroid-启动时运行服务,无活动,android,service,android-service,android-jobscheduler,Android,Service,Android Service,Android Jobscheduler,问题是: 在Android中,似乎没有办法指定DCIM文件夹中您希望同步到云的各个文件夹。Facebook应用程序将图像保存到DCIM/Facebook,因此我保存的任何图像都会自动同步到云。我可以通过在文件夹中放置一个.NOMEDIA文件来解决这个问题,但现在这意味着如果不进入文件资源管理器,我就无法浏览这些文件,因此我无法轻松地在邮件中发送这些图像 目前我正在开发一个Android应用程序,它可以自动将文件(而不是.NOMDEIA文件)从DCIM/Facebook移动到Pictures/Fa
public class FacebookImageListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, FacebookImageMoverService.class));
Log.i("FacebookImageMoverService", "started");
}
}
FacebookImageMoverService.java
public class FacebookImageMoverService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
while (true) {
//TODO remove this
Log.i("imagemover", "DELETE THIS");
// String path = this.getExternalFilesDir(Environment.DIRECTORY_DCIM).getAbsolutePath() + "/Facebook";
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath() + "/Facebook";
Log.d("Files", "Path: " + path);
File directory = new File(path);
File[] files = directory.listFiles();
Log.d("Files", "Size: " + files.length);
for (int i = 0; i < files.length; i++) {
Toast toast = Toast.makeText(this.getApplicationContext(), "FileName:" + files[i].getName(), Toast.LENGTH_LONG);
toast.show();
Log.d("Files", "FileName:" + files[i].getName());
if (!files[i].getName().equals(".NOMEDIA")) {
// moveFile(path + "/", files[i].getName(), this.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/Facebook/");
moveFile(path + "/", files[i].getName(), Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/Facebook/");
}
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//TODO check this out
// return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
//TODO for communication return IBinder implementation
return null;
}
private void moveFile(String inputPath, String inputFile, String outputPath) {
InputStream in = null;
OutputStream out = null;
try {
//create output directory if it doesn't exist
File dir = new File(outputPath);
if (!dir.exists()) {
dir.mkdirs();
}
in = new FileInputStream(inputPath + inputFile);
out = new FileOutputStream(outputPath + inputFile);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
in = null;
// write the output file
out.flush();
out.close();
out = null;
// delete the original file
new File(inputPath + inputFile).delete();
} catch (FileNotFoundException fnfe1) {
Log.e("tag", fnfe1.getMessage());
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
}
}
公共类FacebookImageMoverService扩展服务{
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
while(true){
//要删除此项吗
Log.i(“imagemover”,“删除此文件”);
//String path=this.getExternalFilesDir(Environment.DIRECTORY\u DCIM.getAbsolutePath()+“/Facebook”;
String path=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u DCIM.getAbsolutePath()+“/Facebook”;
Log.d(“文件”,“路径:”+Path);
文件目录=新文件(路径);
File[]files=目录.listFiles();
Log.d(“文件”,“大小:”+文件.length);
对于(int i=0;i
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="shogg.facebookimagemover"
>
<!--<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />-->
<!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round">
<receiver android:name=".FacebookImageListener"
android:icon="@mipmap/ic_launcher"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<service android:enabled="true" android:name=".FacebookImageMoverService" />
</application>
</manifest>
在您的
AndroidManifest.xml
中注册一个BroadcastReceiver
,并通过将此权限添加到清单中来请求侦听设备启动广播的权限:
android:permission=“android.permission.RECEIVE\u BOOT\u COMPLETED”>
然后你就可以开始了