می خواهم Dumpster مانند برنامه ایجاد کنم برای اینکه می خواهم زمانی که هر فایلی حذف شد به من اطلاعیه ای (notification) داده شود تا بتوانم آنرا در حافظه برنامه ذخیره کنم . من از File Observer استفاده می کنم و پس از حذف فایل به من اطلاعیه می دهد اما در marshmallow پس از حذف فایل به من اطلاعیه نمی دهد . من این لینک را برای File Observer ارسال کردم .
من کد زیر را امتحان کردم :
@Override
public void onEvent(intevent,String path){
if (path == null){
return;
}
//the monitored file or directory was deleted, monitoring effectively stops
if ((FileObserver.DELETE_SELF & event) != 0){
FileAccessLogStatic.accessLogMsg += absolutePath + "/" + " is deletedn";
}
}
پاسخ 1 :
بیایید اول موارد زیر را روشن کنیم .
1. Dumpster از دایرکتوری trash استفاده می کند که ممکن است همیشه وجود نداشته باشد . لازم به ذکر است که Dumpster در بسیاری از دستگاه ها به درستی اجرا نمی شود، زیرا از طریق google reviews دیده می شود.
2. Dumpster از File Handler
سیستم خودش استفاده می کند که از یک سرویس برای بررسی رخداد onClick
استفاده می کند و اگر رخداد onClick
مربوط به یک فایل باشد ، فایل را ذخیره کرده و همچنین و همچنین مسیرش را در یک فولدر ( معمولا پنهان ) و آن فولدر را هم در یک database
محلی ذخیره می کند .
3. هر چه امنیت دستگاه افزایش می یابد ، امکان انجام این وظایف کمتر می شود . FileObserver
از مفهوم بررسی هرگونه تغییرات در فایل ها یا حتی دایرکتوری ها استفاده می کند اما شما نمی توانید در آن تاثیری بگذارید به این معنی که شما نمی توانید از حذف آن و رساندن اطلاعیه به کاربر جلوگیری کنید .
4. inotify.h
برای اهداف NDK
استفاده شده است از جمله ایجاد برنامه هایی با استفاده از بررسی پوشه ها و فایل ها . علاوه بر این مفهوم استفاده شده در inotify
مشابه FileObserver
است . پس از حذف فایل، می توانید اعلان دریافت کنید. کد مورد استفاده در inotify چیزی شبیه به این است .
مراحل :
1. نمونه inotify را با استفاده از ()inotify_init
ایجاد کنید .
2. تمام دایرکتوری ها را با استفاده از متد ()inotify_add_watch
در لیست inotify
اضافه کنید .
3. برای تعیین وقایع رخ داده ، ()read را روی نمونه inotify اجرا کنید . این خواندن (read) بلاک خواهد شد تا رخداد تغییر اتفاق بیافتد . توصیه می شود تا برای عمل انتخابی خواندن روی نمونه inotify از فراخوانی متد ()select
استفاده کنید .
4. Read لیستی از رخداد هایی که روی دایرکتوری ها اتفاق افتاده را باز می گرداند . بر اساس مقدار بازگشتی از متد ()read
، ما می فهمیم که چه نوع تغییری رخ داده است .
5. در صورت حذف شدن مشاهده (watch) در دایرکتوری ها یا فایل ها ، ()inotify_rm_watch
را فراخوانی کنید .
دو متد موجود در inotify به صورت زیر هستند :
IN_DELETE
- فایل یا دایرکتوری از دایرکتوری مشاهده شده حذف شده است .
IN_DELETE_SELF
- فایل یا دایرکتوری مشاهده شده خودش حذف شده است .
هر دوی این متد ها شبیه به FileObserver عمل می کنند .
شما احتیاج به ایجاد File Manager
خودتان در جایی دارید که می توانید کلاس FileV2
را که از File
مشتق می شود ، ایجاد کنید و می توانید متد های حذف (delete) یا همه ی متد ها را Override کنید . شما می توانید یک پاپ آپ شخصی سازی شده ایجاد کنید که با زدن دکمه بله ، فایل را به همراه فایل پشتیبان حذف کند و با زدن دکمه نه ، پاپ آپ را ببندد . (اطمینان حاصل کنید کاربر از File Manager برای حذف استفاده می کند در غیر این صورت این کار نخواهد کرد چرا که Override کردن ()delete فقط باعث خراب شدن برنامه های دیگر خواهد شد).
class filev2 extends File{
public filev2(@NonNull String pathname){
super(pathname);
}
public filev2(@NonNull URI uri){
super(uri);
}
@Override
public boolean delete(){
// return super.delete();
//Do as you want and return the boolean.
}
}
اگر کاربر شما از File Manager
استفاده می کند ، مطمئن شوید که فایل های شما ذخیره خواهد شد . شما می توانید intent-filters
را برای این کار تنظیم کنید تا FileManager
در ACTION_VIEW
برای این موضوع به کار آید .