【问题标题】:Android FileObserver does not trigger onEventAndroid FileObserver 不触发 onEvent
【发布时间】:2018-08-06 14:48:08
【问题描述】:

我正在尝试在服务中注册一个 FileObserver,以便在将新照片保存到“/DCIM/Camera/”时进行监控。 到目前为止,我已经尝试了所有可以在网上找到的东西。在我看来,它应该已经可以工作了……

我确实在清单中请求权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <service android:name=".FileWatcherService"
             android:enabled="true"
             android:exported="false"/>
    <!-- Declaring broadcast receiver for BOOT_COMPLETED event. -->
    <receiver android:name=".StartupReceiver" android:enabled="true" android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

我的观察者:

public class FileWatcherService extends Service {

static String PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Camera/";
private static String TAG = "FileWatcher";

public static FileObserver fileObserver = new FileObserver(PATH, CREATE) {
    @Override
    public void onEvent(int i, @Nullable String s) {
        Log.d(TAG, "eventttttt"); //never triggered
    }
};

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onDestroy() {
    Log.d(TAG, "onDestroy: service destroyed");
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate: service created");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    int res = super.onStartCommand(intent, flags, startId);

    fileObserver.startWatching();

    Log.d(TAG,"Service started!");
    return Service.START_STICKY;
}

public static void start(Context ctx) {
    Intent i = new Intent(ctx, FileWatcherService.class);
    ctx.startService(i);
}
}

主要活动:

public class MainActivity extends AppCompatActivity {

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
        Log.v(".","Permission: "+permissions[0]+ "was "+grantResults[0]);

        FileWatcherService.start(getApplicationContext());
    }
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}

我错过了什么?服务启动正常。

感谢您的帮助。

【问题讨论】:

  • 有没有可能是你frogotRead_external_storage?我在您的清单中找不到它
  • 您是否提供了存储权限?
  • @BharathKumar 他提供了write_external_storage,但我找不到read_external_storage,因为我已经评论过
  • @user12346352 如果提供了 write_external_storage,则隐式授予 read_external_storage。 developer.android.com/reference/android/Manifest.permission
  • 您是否向用户请求了读取和编辑存储的权限?

标签: java android file fileobserver


【解决方案1】:

要在本地确认您的更改,请转到设置->应用信息->您的应用->权限并启用“存储”权限。 完全关闭您的应用程序(也从任务中删除),然后检查您的代码是否有效。

看起来实际上缺少的是请求用户访问外部存储。

参考:https://developer.android.com/training/permissions/requesting

【讨论】:

  • 我确实使用权限系统提供并授予了写入权限。但是我确实更新了我的问题并添加了主要活动。也许这有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多