



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發技術】android中對截圖事件進行監聽的原理是什么
這篇文章給大家介紹android中對截圖事件進行監聽的原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。1.監聽截屏圖片所在目錄變化(FileObserver)2.監聽媒體庫的變化(ContentObserver)
上面兩種方法均不是萬能的,需要結合使用才能達到良好的效果,首先看看如何監控目錄在android中,我們可以通過FileObserver來監聽目錄變化,先來看看如何使用private
static
final
File
DIRECTORY_PICTURES
=
new
File(Environment.getExternalStorageDirectory(),
Environment.DIRECTORY_PICTURES);
private
static
final
File
DIRECTORY_DCIM
=
new
File(Environment.getExternalStorageDirectory(),
Environment.DIRECTORY_DCIM);
if
(manufacturer.equalsIgnoreCase("xiaomi"))
{
DIRECTORY_SCREENSHOT
=
new
File(DIRECTORY_DCIM,
"Screenshots");
}
else
{
DIRECTORY_SCREENSHOT
=
new
File(DIRECTORY_PICTURES,
"Screenshots");
}
FILE_OBSERVER
=
new
FileObserver(DIRECTORY_SCREENSHOT.getPath(),
FileObserver.ALL_EVENTS)
{
@Override
public
void
onEvent(int
event,
String
path)
{
if
(event
==
FileObserver.CREATE)
{
String
newPath
=
new
File(DIRECTORY_SCREENSHOT,
path).getAbsolutePath();
Log.d(TAG,
"path:
"
+
newPath);
}
}
};我們對指定目錄的指定事件監聽即可,當事件被觸發時onEvent會回調。這里我們只關心目錄中有沒有新的文件生成。坑1:在實踐中發現,并不是所有手機都允許如此監聽或者說都能收到回調。有的手機上面無法收到CREATE事件,但是可以收到其他事件。我還發現,有的時候收到的事件并沒有在FileObserver中定義,比如32768!下面是Linux中相應event對應的含義,32768=IN_IGNORED,但是為什么會ignore,并不清楚。/lxr/http/source/include/linux/inotify.h?a=m68k#L45還遇到過1073741856(1073741856=0x40000000|0x20,即IN_OPEN|IN_ISDIR)和1073741840(1073741840=0x40000000|0x10,即IN_CLOSE_NOWRITE|IN_ISDIR)。坑2:不同手機,監聽的目錄并不一致。小米需要監聽Environment.DIRECTORY_DCIM,其他監聽Environment.DIRECTORY_PICTURES即可。關于FileObserver這里再多說兩句,FileObserver無法進行遞歸監聽,也就是說,我們監聽的文件夾中如果有子文件夾,并且我們想知道其中變化,這種方式是不可行的。需要手動對子文件進行操作。另外,當我們監聽的目錄/文件被刪除后又重新建立了一個同名的目錄/文件,之前的FileObserver不會繼續工作,需要重新設置監聽才行。還要注意,FileObserver回調并不在主線程中,而是在FileObserver線程中。鑒于上述原因,我們還要使用方法2,監聽媒體庫變化。這個方法使用ContentObserver即可。private
static
final
ContentObserver
CONTENT_OBSERVER
=
new
ContentObserver(HANDLER)
{
@Override
public
void
onChange(boolean
selfChange,
Uri
uri)
{
//記得先檢查讀文件的權限
ContentResolver
resolver
=
GeneralInfoHelper.getContext().getContentResolver();
if
(uri.toString().matches(MediaStore.Images.Media.EXTERNAL_CONTENT_URI
+
"(/\\d+)?"))
{
Cursor
cursor
=
resolver.query(uri,
PROJECTION,
null,
null,
MediaStore.MediaColumns.DATE_ADDED
+
"
DESC");
if
(cursor
!=
null
&&
cursor.moveToFirst())
{
//完整路徑
String
newPath
=
cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA));
File
file
=
new
File(newPath);
//file.exists()
判斷文件是否存在
}
if
(cursor
!=
null)
{
cursor.close();
}
}
}
};
getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
true,
CONTENT_OBSERVER);坑3:實踐中發現,并不是所有手機都是監聽相同的Uri,有的帶數字,有的不帶。坑4:查詢數據庫時記得按MediaStore.MediaColumns.DATE_ADDED字段排序,注意,這個時間單位是秒,不是毫秒坑5:即使排了序,你拿到的仍然有可能不是正確的,在魅族E2上面出現了這個問題。但是當我刪除了魅族E2截圖文件夾之后,一切又恢復正常了……這里我做了一個簡單的判斷,如何DATE_ADDED和當前時間相差兩秒以內,那么從數據庫查出的這條數據我視為有效坑6:當用戶刪除了截圖文件夾的時候,媒體庫此時會更新,所以此時onChange會收到大量回調,所以這里需要判斷判斷文件是否存在。可能有人會問,為什么不直接用第二種方法?原因有2,首先從坑5可以看出第二種方法也并非100%有效,其次,這種方法速度很慢,通常會有2-3秒的延遲。而第一種方法如果有效,通常都會比后者快很多。好了,障礙基本掃清,下面開始融合兩種方法首先使用成員變量記錄截圖文件路徑private
static
String
sScreenshotPath;當方法1或者方法2收到結果時,用收到的結果與sScreenshotPath對比,如果是同一個文件,那么就無需再次通知了,否則則進行通知。邏輯太簡單,代碼就不寫了。但是實際情況是不會這么樂觀的。坑7:在實踐中發現,有的系統不直接保存截圖,而是先生成一個隱藏文件,比如叫.截圖.jpg,然后再修改文件名(去掉“.”)。這種情況下,我們可能就會收到兩次用戶截圖事件的回調(方法1和方法2都可能收到回調),但實際用戶只截了一次。這里我做了一個特殊處理,在判斷是否是同一個文件時,只判斷文件名,而不去管文件的完整路徑也不管文件是否隱藏(也就是不比較文件名前面的“.”)//僅靠文件名而不是全路徑判斷是否為同一個截圖文件,因為有些系統對截圖有move操作
private
static
boolean
isSameFile(String
newPath)
{
if
(TextUtils.isEmpty(sScreenshotPath))
{
return
false;
}
return
TextUtils.equals(removePrefixDot(new
File(sScreenshotPath).getName()),
removePrefixDot(new
File(newPath).getName()));
}
private
static
String
removePrefixDot(@NonNull
St
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人2025年社區下半年工作方案
- 2025年醫院512護士節活動策劃方案
- 2025年農村幼兒園老師方案
- 2025年電動機綜合保護起動器項目可行性研究報告
- 2025年生物酶制劑項目可行性研究報告
- 2025年特殊鉚釘項目可行性研究報告
- 2025年燃油灶具項目可行性研究報告
- 全國普通高等學校招生統一考試2024-2025學年高三第四次月考模擬生物試題含解析
- 利辛縣2025年小升初總復習數學測試題含解析
- 山東省微山縣一中2024-2025學年高三沖刺高考模擬生物試題(五)含解析
- 2025年河北省唐山市中考一模道德與法治試題(含答案)
- 放療皮膚反應分級護理
- 2025年03月內蒙古鄂爾多斯市東勝區事業單位引進高層次人才和緊缺專業人才50人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 衛生院全國預防接種日宣傳活動總結(8篇)
- 小學消防知識教育
- 勞務派遣勞務外包服務方案(技術方案)
- DB65∕4349-2021 棉漿粕和粘膠纖維工業水污染物排放標準
- 《鐵道概論鐵路車站》PPT課件
- 高一信息技術第六章結構圖
- 豆各莊鄉土地儲備住宅房屋騰退補償安置辦法
- 【課件】第9課 美在民間——中國民間美術——剪紙課件-高中美術人教版(2019)美術鑒賞
評論
0/150
提交評論