什么是人臉匿名( Face Anonymization )
隨著人臉識(shí)別技術(shù)的普及,人臉數(shù)據(jù)的隱私問題也得到越來越多關(guān)注,針對(duì)隱私保護(hù)的研究也陸續(xù)出現(xiàn)。目前大致有下面幾個(gè)方向 篡改輸入人臉識(shí)別系統(tǒng)的圖像。 生成式對(duì)抗網(wǎng)絡(luò)(GAN)來匿名某人的照片或視頻。 直接模糊人臉識(shí)別到的人臉
本文主要講第 3 點(diǎn),講講怎么使用移動(dòng)端人臉關(guān)鍵點(diǎn)算法實(shí)現(xiàn)人臉匿名功能。這種方法對(duì)設(shè)備要求低,代碼簡(jiǎn)單易懂,修改后就可直接落地。
下圖就是最終想實(shí)現(xiàn)的功能
什么是人臉關(guān)鍵點(diǎn)算法( Face Landmarks )
人臉關(guān)鍵點(diǎn)檢測(cè)是人臉相關(guān)算法中的關(guān)鍵一環(huán),它是人臉識(shí)別、表情分析、3D 人臉重建,表情驅(qū)動(dòng) 3D 動(dòng)畫等一系列人臉相關(guān)問題的前提。
我們將使用 TengineKit 來實(shí)現(xiàn)人臉匿名功能
TengineKit
免費(fèi)移動(dòng)端實(shí)時(shí)人臉 212 關(guān)鍵點(diǎn) SDK 。是一個(gè)易于集成的人臉檢測(cè)和人臉關(guān)鍵點(diǎn) SDK 。它可以在各種手機(jī)上以非常低的延遲運(yùn)行。
https://github.com/OAID/TengineKit
TengineKit 效果圖
實(shí)現(xiàn)
配置 Gradle
Project 中的 build.gradle 添加 repositories { ... mavenCentral() ... } allprojects { repositories { ... mavenCentral() ... } }
主 Module 中的 build.gradle 添加 dependencies { ... implementation 'com.tengine.android:tenginekit:1.0.3' ... }
配置 manifests
初始化 Android Camera
為 App 創(chuàng)建自定義攝像頭界面的步驟如下: 檢測(cè)和訪問 Camera 創(chuàng)建預(yù)覽 TextureView 構(gòu)建預(yù)覽 TextureView 布局 將 Camera 和 TextureView 綁定 啟動(dòng)預(yù)覽
我們先 new 一個(gè) TextureView.SurfaceTextureListener,在里面完成 camera 的初始配置,當(dāng) TextureView 可用的時(shí)候,onSurfaceTextureAvailable 中的代碼將被調(diào)用 private final TextureView.SurfaceTextureListener surfaceTextureListener = new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(final SurfaceTexture texture, final int width, final int height) { int index = getCameraId(); camera = Camera.open(index); try { Camera.Parameters parameters = camera.getParameters(); List focusModes = parameters.getSupportedFocusModes(); if (focusModes != null && focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); } List cameraSizes = parameters.getSupportedPreviewSizes(); Size[] sizes = new Size[cameraSizes.size()]; int i = 0; for (Camera.Size size : cameraSizes) { sizes[i++] = new Size(size.width, size.height); } Size previewSize = CameraConnectionFragment.chooseOptimalSize(sizes, desiredSize.getWidth(), desiredSize.getHeight()); parameters.setPreviewSize(previewSize.getWidth(), previewSize.getHeight()); camera.setDisplayOrientation(90); camera.setParameters(parameters); camera.setPreviewTexture(texture); } catch (IOException exception) { camera.release(); } camera.setPreviewCallbackWithBuffer(imageListener); Camera.Size s = camera.getParameters().getPreviewSize(); camera.addCallbackBuffer(new byte[ImageUtils.getYUVByteSize(s.height, s.width)]); textureView.setAspectRatio(s.height, s.width); camera.startPreview(); } @Override public void onSurfaceTextureSizeChanged(final SurfaceTexture texture, final int width, final int height) { } @Override public boolean onSurfaceTextureDestroyed(final SurfaceTexture texture) { return true; } @Override public void onSurfaceTextureUpdated(final SurfaceTexture texture) { } };
此處將 textureView 和 camera 聯(lián)系起來 textureView.setSurfaceTextureListener(surfaceTextureListener);
當(dāng) camera 啟動(dòng)預(yù)覽,textureView 得到真實(shí)的 size 后。我們得到了 camera 的輸出視頻流的寬高和預(yù)覽 textureView,將其保存起來,后續(xù)有用到。 textureView.setRealSizeListener(new AutoFitTextureView.RealSizeListener() { @Override public void onRealSizeMeasure(int w, int h) { if(!isReady){ isReady = true; Camera.Size s = camera.getParameters().getPreviewSize(); cameraReadyListener.onCameraReady( s.width, s.height,w, h ); } } });
處理 Camera 傳過來的視頻流
首先我們先初始化 TengineKit: 選用 camera 處理模式 打開人臉檢測(cè)和人臉關(guān)鍵點(diǎn)功能 設(shè)置視頻流格式為 YUV_NV21 ( Android camera 默認(rèn)格式) 設(shè)置輸入視頻流的寬高,此處為 camera 的預(yù)覽寬高 設(shè)置輸出視頻流的寬高,此處為 textrureView 的寬高 設(shè)置輸入視頻流來自前置攝像頭 com.tenginekit.Face.init(getBaseContext(), AndroidConfig.create() .setCameraMode() .openFunc(AndroidConfig.Func.Detect) .openFunc(AndroidConfig.Func.Landmark) .setInputImageFormat(AndroidConfig.ImageFormat.YUV_NV21) .setInputImageSize(previewWidth, previewHeight) .setOutputImageSize(outputWidth, outputHeight) ); com.tenginekit.Face.Camera.switchCamera(false);
處理數(shù)據(jù) 得到手機(jī)旋轉(zhuǎn)角度,將其設(shè)置到 TengineKit 開始檢測(cè),當(dāng)檢測(cè)到人臉數(shù)目大于 0 的時(shí)候,調(diào)用 faceDetect.landmark2d(),得到人臉關(guān)鍵點(diǎn)鏈表 int degree = CameraEngine.getInstance().getCameraOrientation(sensorEventUtil.orientation); com.tenginekit.Face.Camera.setRotation(degree - 90, false, outputWidth, outputHeight); com.tenginekit.Face.FaceDetect faceDetect = Face.detect(data); faceLandmarks = null; if(faceDetect.getFaceCount() > 0){ faceLandmarks = faceDetect.landmark2d(); }
高斯模糊和繪制
這里使用 Android 的 bitmap 來實(shí)現(xiàn)功能,這種做法比較粗糙,性能差,但是簡(jiǎn)單易懂,如果讀者有興趣可以使用 OpenGLES 來實(shí)現(xiàn)此功能。 將從攝像頭中得到的 yuv 數(shù)據(jù)通過 TengineKit 的圖片幫助函數(shù)轉(zhuǎn)化為 Bitmap 通過人臉關(guān)鍵點(diǎn)的外接框,裁剪 bitmap 得到人臉的 bitmap 數(shù)組 將得到的人臉 bitmap 進(jìn)行高斯模糊 if(testBitmap != null){ testBitmap.recycle(); } testBitmap = Face.Image.convertCameraYUVData( data, previewWidth, previewHeight, outputWidth, outputHeight, - 90, true); for(Bitmap bitmap : testFaceBitmaps){ bitmap.recycle(); } testFaceBitmaps.clear(); if(testBitmap != null && faceDetect.getFaceCount() > 0){ if(faceLandmarks != null){ for (int i = 0; i < faceLandmarks.size(); i++) { Bitmap face = BitmapUtils.getDstArea(testBitmap, faceLandmarks.get(i).getBoundingBox()); face = BitmapUtils.blurByGauss(face, 50); testFaceBitmaps.add(face); } } } runInBackground(new Runnable() { @Override public void run() { trackingOverlay.postInvalidate(); } });
trackingOverlay 為定制的 view,將 canvas 暴露出來用于畫 bitmap trackingOverlay.addCallback(new OverlayView.DrawCallback() { @Override public void drawCallback(final Canvas canvas) { if(testBitmap != null){ canvas.drawBitmap(testBitmap, 0,0, circlePaint); } if(faceLandmarks != null){ for (int i = 0; i < faceLandmarks.size(); i++) { Rect r = faceLandmarks.get(i).getBoundingBox(); canvas.drawRect(r, circlePaint); canvas.drawBitmap(testFaceBitmaps.get(i), r.left, r.top, circlePaint); } } } });
效果
Demo
參考
https://github.com/OAID/TengineKit
源碼
https://github.com/jiangzhongbo/TengineKit_Demo_Identity_Protection
知乎
https://zhuanlan.zhihu.com/p/161038093
dialer beta 有手動(dòng)錄音了,會(huì)跟雙方通知開始錄音了
錄音檔的管理一貫?zāi)蛐宰龀闪艘慧缡?
型號(hào):RedMi 8A系統(tǒng):MIUI 10.3.3 出現(xiàn)問題: 安裝 Instagram 顯示安裝失?。?113 ),失敗原因:其它原因。 安裝過 Whatsapp,Messenger 和其它 APP 都是正常的,“其它原因”是什么原因呢??
這點(diǎn)好像和 pc 上的瀏覽器不一樣.起因是: https://github.com/claudiodangelis/qrcp 這個(gè)項(xiàng)目, 默認(rèn)不加-k 選項(xiàng),下載完成后服務(wù)端就斷開了,用 android 手機(jī)上自帶的瀏覽器發(fā)現(xiàn)總是下載失敗和 PC 上的瀏覽器的差異在于, PC 上半天不點(diǎn)擊 Ok 的話,其實(shí)瀏覽器已經(jīng)給你下下來了(可以通過 response 看到),這個(gè)時(shí)候服務(wù)端即使斷開,你再點(diǎn)擊保存是成功的. android 上的瀏覽器,我的理解沒有點(diǎn)擊"確定"按鈕也應(yīng)該下載了的,因?yàn)榉?wù)端是把數(shù)據(jù)傳輸完畢才關(guān)閉的,但是都是顯示下載失敗... 不知道為啥
詳情請(qǐng)戳-> https://www.androidweekly.io/android-dev-weekly-issue-291/
歡迎關(guān)注公眾號(hào):
找了半天沒找到,網(wǎng)上說的幾個(gè)位置都沒有,但是代碼又能引用到
各位兄弟,剛?cè)肓藗€(gè) mi10,去 google play 上下載了一些應(yīng)用,大家都知道 play 版本,一般版本號(hào)比國(guó)內(nèi)要小,所以一大早醒來發(fā)現(xiàn)全被應(yīng)用商城更新成國(guó)內(nèi)最新版本了。
請(qǐng)問大家一般怎么處理這種情況的?
之前收藏過,但是好多壓縮包都損壞打不開了,最主要的是缺少視頻里面提到的 sql 文件
我試過的 windows 安卓模擬器都是先啟動(dòng)模擬器再啟動(dòng) app 。有沒有安卓模擬器是可以在 windows 上生成 app 的快捷方式,直接點(diǎn)擊就能啟動(dòng) app ?之前試過 Chrome ARC Welder,能實(shí)現(xiàn),但問題 ARC 支持的 app 太少了,很多 app 都不能正常運(yùn)行。google 了很久,都沒有找到。不過,了解到這種操作方式應(yīng)該就是跟 Parallels Coherence 模式差不多。 或者類似 linux anbox,貌似 andbox 也是要先啟動(dòng) andbox,再打開 app,只是只是每個(gè) app 都是獨(dú)立運(yùn)行在一個(gè)窗口中。
有這個(gè)奇葩需求的原因是:國(guó)內(nèi)特色銀行 APP (但是國(guó)內(nèi) Android 不 Magisk 簡(jiǎn)直一言難盡。
請(qǐng)教大家一個(gè)問題,類似閱讀器仿真紙張翻頁(yè) 有什么好的思路。 <使用 1 個(gè) view 多個(gè) bitmap 交替繪制思路,無法應(yīng)對(duì)復(fù)雜的子 view 布局,view 廣告引入,復(fù)雜的點(diǎn)擊區(qū)域處理,所以后來放棄了> ios 的解決方案很優(yōu)秀,人家 view 就能卷曲,android 的一言難盡[Facepalm]
目前使用 recyvlerview 作為 view 緩存管理,利用 layoutmanager 制作了,平移,y 軸翻轉(zhuǎn)動(dòng)畫 詳細(xì)可看這里: https://www.jianshu.com/p/1992d49e5fbf 現(xiàn)在想引入卷曲動(dòng)畫(俗稱仿真動(dòng)畫)
目前方案 A:基于根 view 緩存整體渲染效果到 bitmap 在根布局 onDrawForeground 繪制卷曲動(dòng)畫,view 接受滑動(dòng)事件,繪制效果,并將平移距離傳遞給 recyclerview 更新坐標(biāo) 優(yōu)點(diǎn):?jiǎn)雾?yè) view 依然保持解耦,無需關(guān)系事件 缺點(diǎn)盲點(diǎn):上一頁(yè)怎么辦?如何處理上一頁(yè)效果呢,子 view 刷新了呢?
/:8*希望大家多多幫忙,分析可行我都嘗試下
為了便于在 Google Play 上買買買,這幾天,我尋思著要給我的谷歌賬號(hào)充值。網(wǎng)上查了一下,最方便的,似乎是購(gòu)買 Google Play 禮品卡進(jìn)行兌換。 很多人提醒,如果買到黑卡進(jìn)行兌換,則谷歌賬號(hào)可能會(huì)被封號(hào)。 據(jù)說,谷歌也不支持跨區(qū)購(gòu)買應(yīng)用,若綁定國(guó)內(nèi)的信用卡,則谷歌賬號(hào)也有可能會(huì)被封號(hào)。 思量再三,我決定,購(gòu)買禮品卡,但不在淘寶購(gòu)買,而是在 amazon.com (注意,不是amazon.cn )網(wǎng)站購(gòu)買。注冊(cè) amazon.com 賬號(hào),選禮品卡,填寫金額,寄送郵箱等等,提交訂單,填寫信用卡,賬單地址等,提交結(jié)算。約半分鐘左右,我收到訂單確認(rèn)郵件。 又過了 4 分鐘左右,我收到了訂單被暫停,以及 amazon.com 賬戶被封停的郵件?,F(xiàn)正在申請(qǐng)解封。 感覺腦袋有點(diǎn)暈。
偶然發(fā)現(xiàn)一個(gè) app 在手機(jī)上和 TV 上布局不一樣。 能找到的 app 判斷是否運(yùn)行在 TV 上的代碼只有這么一段: UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE); if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) { 是 tv } else { 不是 tv }
但是從網(wǎng)上搜索編譯安卓 TV 的資料寥寥無幾,想問一下哪些編譯參數(shù)會(huì)決定編譯出來的安卓是 TV 還是手機(jī)
請(qǐng)大佬們從各個(gè)方面分析對(duì)比 比如 操作,性能,生態(tài)等等
聊天軟件經(jīng)常會(huì)發(fā)送圖片,有的軟件只有”圖片”一個(gè)按鈕,有的軟件有“圖片”和“拍照”兩個(gè)按鈕。所以哪一種設(shè)計(jì)更好?
手機(jī)已經(jīng) root,進(jìn)入了開發(fā)者模式并打開了 usb 調(diào)試功能以及允許安裝未知來源的應(yīng)用。
Android studio 4.0 棄用了 Android device moniter 和 Hierarchy Viewer,改用了 Layout Inspector 。使用 Layout Inspector 時(shí),沒有 教程 中出現(xiàn)的 choose process 窗口,而是自動(dòng)彈出了自建 project 對(duì)應(yīng) app 的監(jiān)控視圖,手機(jī)也自動(dòng)顯示了自建的軟件。在底部窗口也只有一個(gè)自建 app 的這一個(gè) process 可選。
請(qǐng)問如何通過 Android studio 獲取微信控件的 id 呢?(想用 AccessibilityService 實(shí)現(xiàn)一個(gè)微信自動(dòng)回復(fù)機(jī)器人)
網(wǎng)易新聞使用頻率很高, 開屏頁(yè)面以及應(yīng)用內(nèi)都是京東的廣告,10 次打開網(wǎng)易新聞,8 次都不小心點(diǎn)了跳到京東 APP
但是顯示的大小有點(diǎn)不一樣 怎么讓他們完全一致呢。imageview 是設(shè)置的 src
以前用訊飛 or 百度輸入法,可以輸入“riqi”,第二個(gè)候選詞就是今天日期
但最近都換成了 Gboard,沒這功能了,總不能每次輸入,還臨時(shí)切換下輸入法吧?
有什么便捷的輸入今天年月日的方法嗎?(例如 通知欄有個(gè)常駐小插件,點(diǎn)一下就自動(dòng)復(fù)制當(dāng)前日期到剪貼板?)
比如把后蓋下下來、拆掉幾個(gè)攝像頭、拆掉無線充電線圈之類的,不知道會(huì)不會(huì)有損傷。反正手機(jī)有手機(jī)殼,平常也只需要一個(gè)可以掃碼的攝像頭,要用的時(shí)候再裝回去感覺似乎降低不了多少重量,里面是有鋼板之類的東西嗎? 另外,手機(jī)還在保,所以盡量不要讓售后能看出來,不過也快要過保了
應(yīng)用名稱:Trichrome Library包名:com.google.android.trichromelibrary 測(cè)試設(shè)備的 Android 版本:10 這個(gè)應(yīng)用可以在 APKMirror 上下載,直接點(diǎn)擊 APK 安裝提示安裝成功,卻不能在應(yīng)用列表里面找到此應(yīng)用,使用第三方軟件讀取應(yīng)用列表也不能找到此應(yīng)用,嘗試再次點(diǎn)擊 APK 安裝時(shí)出現(xiàn)的是安裝應(yīng)用而不是更新應(yīng)用,再次嘗試安裝仍然安裝成功,但依然無法找到此應(yīng)用。在 TWRP 下查看 /data/app 目錄下能找到多個(gè)以 com.google.android.trichromelibrary 開頭的文件夾。 為什么會(huì)這樣呢?
之前用 XR,618 買了 oneplus 8pro,感覺這個(gè)屏幕長(zhǎng)度也太長(zhǎng)了吧,用了好多天了,還沒習(xí)慣。
話說現(xiàn)在安卓手機(jī)尺寸都很長(zhǎng),這是以后的趨勢(shì)嗎?
照片視頻音頻等文件,如何加密,有相關(guān) app 嗎?
印象中三星的國(guó)行 ROM 一直對(duì) Google 有不錯(cuò)的支持。
手持三星 S9+港行 SM-G9650 (已刷國(guó)行 One UI ROM ),Google 賬號(hào)在美區(qū),通過下載 Google 開啟了系統(tǒng)內(nèi)置的 google 服務(wù),之前一直可以從 Google play 正常下載使用 Netflix,然而在最近某次系統(tǒng)更新后,play 商店開始搜索不 Netflix 和 sky 光遇等 APP,并在打開頁(yè)面提示“已不再兼容您的設(shè)備”。
這個(gè)現(xiàn)象顯然是 SafetyNet 沒過引發(fā)的,但檢查之后發(fā)現(xiàn),機(jī)器依然是:未 Root 、Knox 未觸發(fā)、Widevine CDM security level L1 、SafetyNet 四項(xiàng)全部 success (通過 SafetyNet Test app 測(cè)試)、Google play 顯示“設(shè)備已認(rèn)證”, 之前安裝的 Netflix 可以正常觀看 。
嘗試過清空 cache 和 data,更新 Google play service 和 Google play store 到最新,問題依舊。
求助各位:我漏掉了哪一點(diǎn)才導(dǎo)致了 Google 不認(rèn)可手中的設(shè)備?試著跟三星反饋問題,得到的回答是千篇一律的:Google 在中國(guó)無法使用,Netflix 還不支持中國(guó)大陸……簡(jiǎn)直有毒。
作為普通平民,在目前 5G 網(wǎng)絡(luò)還沒完善,流量資費(fèi)還沒下降,5G 手機(jī)價(jià)格普遍較高的情況下,明顯入手 5G 手機(jī)不合適。如果入手 4G 手機(jī),又好像有點(diǎn)倒退。
但是剛好要換手機(jī)的話,現(xiàn)在入手 5G 手機(jī)是否合適?或者說,5G 網(wǎng)絡(luò)會(huì)在多久以后可以替代目前的 4G ?
早上開機(jī)還沒廣告圖,開機(jī)過了半小時(shí)。廣告圖出現(xiàn)了,很久前就已經(jīng)設(shè)置關(guān)閉廣告壁紙!但是然并卵?。?
現(xiàn)在的廠家實(shí)在太惡心人了
各位大神,安卓加固,關(guān)于 Android 加固,有沒有什么好的 APP 加固方案?可以分享一下嗎?
很高興見到你!我是 《 Jetpack MVVM Best Practice 》 作者 KunMinX 。
今天我們介紹的 “數(shù)據(jù)倒灌” 一詞,是我為了方便理解和記憶 “頁(yè)面在 ‘二進(jìn)宮’ 時(shí)收到舊數(shù)據(jù)推送” 的情況 ,而在 2019 年 自創(chuàng)并在網(wǎng)上傳播的 對(duì)此類現(xiàn)象的概括 。
它主要發(fā)生在:通過 SharedViewModel + LiveData 的組合來解決頁(yè)面通信的問題時(shí)。
關(guān)于 為什么會(huì)存在這個(gè)現(xiàn)象、為什么要使用 SharedViewModel + LiveData 等問題,可詳見 《 LiveData 數(shù)據(jù)倒灌》 篇對(duì)背景緣由的解析。
現(xiàn)有解決方案及各自缺陷
在 《 Jetpack MVVM 精講》 中我分別提到了 Event 事件包裝器、反射方式、SingleLiveEvent 這三種方式來解決 “數(shù)據(jù)倒灌” 的問題。它們分別來自上文我們提到的 外網(wǎng) 、 美團(tuán) 的文章,和官方最新 demo 。
但正如我在 《 Jetpack MVVM 精講》 介紹的,它們分別存在如下問題:
Event 事件包裝器:
對(duì)于多觀察者的情況,只允許第一個(gè)觀察者消費(fèi),這不符合現(xiàn)實(shí)需求;
而且手寫 Event 事件包裝器,在 Java 中存在 null 安全的一致性問題。
反射干預(yù) Version 的方式:
存在延遲,無法用于對(duì)實(shí)時(shí)性有要求的場(chǎng)景;
并且數(shù)據(jù)會(huì)隨著 SharedViewModel 長(zhǎng)久滯留在內(nèi)存中得不到釋放。
官方最新 demo 中的 SingleLiveEvent:
是對(duì) Event 事件包裝器 一致性問題的改進(jìn),但未解決多觀察者消費(fèi)的問題;
而且額外引入了消息未能從內(nèi)存中釋放的問題。
UnPeekLiveData 特點(diǎn)
UnPeekLiveData 通過 獨(dú)創(chuàng)的 “延時(shí)自動(dòng)清理消息” 的設(shè)計(jì) ,來滿足:
1.消息被分發(fā)給多個(gè)觀察者時(shí), 不會(huì)因第一個(gè)觀察者消費(fèi)了而直接被置空
2.時(shí)限到了, 消息便不再會(huì)被倒灌
3.時(shí)限到了, 消息自動(dòng)從內(nèi)存中清理釋放
4.使非入侵的設(shè)計(jì)成為可能,并最終結(jié)合官方 SingleLiveEvent 的設(shè)計(jì)實(shí)現(xiàn)了 遵循開閉原則的非入侵重寫 。
并且 UnPeekLiveData 提供了構(gòu)造器模式,可通過構(gòu)造器組裝適合自己業(yè)務(wù)場(chǎng)景的 UnPeekLiveData 。
License
本文以 CC 署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際協(xié)議 發(fā)行。
Copyright ? 2019-present KunMinX
文中提到的 對(duì) “ 數(shù)據(jù)倒灌 ” 一詞及其現(xiàn)象的概括、對(duì) Event 事件包裝器、反射方式、SingleLiveEvent 各自存在的缺陷 的理解,以及對(duì) UnPeekLiveData 的 “ 延遲自動(dòng)清理消息 ” 的設(shè)計(jì), 均屬于本人獨(dú)立原創(chuàng)的成果 ,本人對(duì)此享有最終解釋權(quán)。
任何個(gè)人或組織在引用上述內(nèi)容時(shí), 須注明原作者和出處 。未經(jīng)授權(quán)不得用于洗稿、廣告包裝等商業(yè)用途。
GitHub
https://github.com/KunMinX/UnPeekLiveData
b 站鏈接:https://b23.tv/BV1FC4y1h7fN 榮耀 30pro 和紅米 k30 pro 一直是 3000 元上下 性價(jià)比旗艦 5G 手機(jī)里無法忽視的力量,我們右手網(wǎng)上周剛剛做了一期榮耀 30pro 的視頻,有興趣的朋友可以在我們的微博或者 B 站頻道查看,今天我們要給大家說道說道紅米 K30 pro 這個(gè)手機(jī),并在一些地方對(duì)比一下這兩個(gè)機(jī)器,希望給您一些購(gòu)機(jī)上的決策,兩個(gè)機(jī)器都是右手網(wǎng)自費(fèi)購(gòu)買,沒有恰飯因素。本視頻文本腳本 https://www.uso.cn/post/view/56023
字節(jié)跳動(dòng),應(yīng)該大家比較熟了,不過多介紹。抖音創(chuàng)作工具部門,主要是負(fù)責(zé)抖音內(nèi)的拍攝、視頻編輯、發(fā)布整個(gè)流程,是 app 內(nèi)的核心業(yè)務(wù)之一。前不久,部門在杭州開設(shè)了 Office,目前需要大量的客戶端研發(fā),尤其急需 Android 研發(fā)人員。具體的 JD 如下:
職位描述
1 、負(fù)責(zé)負(fù)責(zé)字節(jié)跳動(dòng)互娛的 Android 手機(jī)軟件的開發(fā)及設(shè)計(jì),包括但不限于抖音等產(chǎn)品的研發(fā);
2 、根據(jù)產(chǎn)品的需求進(jìn)行 Android 產(chǎn)品的開發(fā),對(duì)相關(guān)模塊做重構(gòu)和優(yōu)化;
3 、對(duì) Android 平臺(tái)開發(fā)技術(shù)進(jìn)行研究,定位和解決一些技術(shù)上的疑難問題;
4 、根據(jù)項(xiàng)目需求進(jìn)行學(xué)習(xí)并快速掌握技巧,有良好的溝通力和協(xié)作能力加強(qiáng)團(tuán)隊(duì)的建設(shè)。
職位要求
1 、本科及以上計(jì)算機(jī)相關(guān)專業(yè)畢業(yè),至少兩年以上 Android 開發(fā)經(jīng)驗(yàn);
2 、熟練掌握 git,熟練掌握 android studio 開發(fā)工具及各種性能調(diào)優(yōu);
3 、熟悉 Android 平臺(tái)的開發(fā)技術(shù),如 UI,網(wǎng)絡(luò),性能和內(nèi)存優(yōu)化等;
4 、熟悉面向?qū)ο笤O(shè)計(jì),代碼風(fēng)格良好;
5 、有一定的承壓能力,良好的團(tuán)隊(duì)合作意識(shí);
6 、有大型互聯(lián)網(wǎng) app 開發(fā)經(jīng)驗(yàn)優(yōu)先。
如何投遞
感興趣的朋友,可以直接聯(lián)系我(微信:ZouXiaoChuang ),也可以直接點(diǎn)擊鏈接 https://job.toutiao.com/s/JFUd7hS 用這個(gè)鏈接投遞,也算內(nèi)推投遞。
幾個(gè)常見的問題:
Q:是不是會(huì)考算法?
A: 編程題是幾輪技術(shù)面都必須的一環(huán)。有的會(huì)涉及到算法知識(shí),有的不一定涉及到算法知識(shí)。如果比較擔(dān)心這塊的話,可以多刷刷 LeetCode 。
Q:公司是大小周嗎?
是的,公司目前默認(rèn)是大小周,不過加班的那天是額外算工資的,而且那天的工資比正常的工作日要高。具體可以到時(shí)候跟 HR 了解。如果不在乎那天的工資,完全可以請(qǐng)假,不占用年假天數(shù)。
Q:杭州辦公地點(diǎn)是哪里?
杭州研發(fā)部門主要有兩個(gè)辦公地點(diǎn),EFC (歐美金融城)和西溪八方城,目前抖音創(chuàng)作工具線在 EFC,9 月份左右會(huì)搬到八方城。
Q:字節(jié)跳動(dòng)杭州那么多部門,為什么我要去創(chuàng)作工具線?
說點(diǎn)我個(gè)人的想法。年輕的時(shí)候,比較最求所謂的技術(shù)是否酷炫,是否先進(jìn),更注重所謂技術(shù)的成長(zhǎng)。慢慢的,年紀(jì)大了,你會(huì)意識(shí)到,你做的事情是否真正能落地,是否有業(yè)績(jī)產(chǎn)出,是否對(duì)團(tuán)隊(duì)、對(duì)公司、對(duì)用戶有真正的貢獻(xiàn),這才是最重要的。而這也是公司內(nèi)部升職加薪、跳槽時(shí)對(duì)方公司給你 Offer 最重要的指標(biāo)。
從這點(diǎn)出發(fā),考慮一個(gè)業(yè)務(wù)方向,主要看兩點(diǎn),一是業(yè)務(wù)是否穩(wěn)定,是否核心,而是二是否跟用戶直接相關(guān)。
說回創(chuàng)作工具線,首先,創(chuàng)作工具模塊是抖音 app 內(nèi)部不可或缺的一個(gè)模塊,因?yàn)樗苯佑绊懙接脩舻呐臄z、發(fā)布體驗(yàn)。如果視頻編輯、發(fā)布體驗(yàn)不好,那么發(fā)視頻的人就少,發(fā)布的人少了,自然看的人也少??上攵?公司對(duì)這方面是非常重視的,在這方面的業(yè)務(wù)投入只會(huì)多不會(huì)少。再次,你的工作,無論是做的特效,做的貼紙或其他處理,都直接體現(xiàn)在用戶的視頻拍攝、編輯流程中,因此,工作的產(chǎn)出也是顯而易見的。
最后還想說一句,隨著 5G 慢慢鋪開,可以預(yù)想到各個(gè)公司會(huì)更加在視頻上投入力度,把視頻玩出更多的花樣來。因此,現(xiàn)在來抖音這邊,在視頻處理上面的積累,可以保證未來幾年的職業(yè)競(jìng)爭(zhēng)力。
因此,不是說其他業(yè)務(wù)線不好,這個(gè)每個(gè)人可以有自己的判斷。我只是想說,如果你想法跟我一樣的話,那么抖音創(chuàng)作工具線,是一個(gè)不會(huì)錯(cuò)的選擇。
Q:給我一個(gè)理由,為什么要去字節(jié)跳動(dòng)?
作為工作八年多的老司機(jī),算上實(shí)習(xí),經(jīng)歷了小紅書、蘑菇街、微策略、阿里、創(chuàng)新工場(chǎng)、英特爾、還有其他一些不那么知名的,總共將近 10 個(gè)公司的人,想說一句,拋開工作內(nèi)容(因?yàn)檫@點(diǎn)跟個(gè)人喜好相關(guān)較大,比較主觀),綜合薪資待遇、技術(shù)氛圍、公司氛圍、員工關(guān)懷等多個(gè)客觀因素來說,字節(jié)跳動(dòng)是我覺得最好的公司,也是我迄今為止呆的最久的公司。
在這里,大家都是想干事實(shí)的人,沒有那么多的勾心斗角。公司鼓勵(lì)坦誠(chéng)清晰,不設(shè)邊界,哪怕是一個(gè)剛畢業(yè)的同學(xué),你也可以跟老同學(xué)去討論你的想法,你的技術(shù)方案。工作或許繁忙,但你的心不會(huì)委屈。你說,多少年以后,公司會(huì)不會(huì)變成跟 XX 一樣,這個(gè)我沒法回答,但是至少這幾年,公司總體來說還是處于一個(gè)很好的氛圍的。
在員工關(guān)懷方面,說一個(gè)細(xì)節(jié),很多公司都會(huì)說,我們有下午茶,有零食水果,然后你會(huì)發(fā)現(xiàn),全是一些沒人吃的零食,擺在某一個(gè)地方吃灰。然而字節(jié)跳動(dòng)的下午茶,是每天下午,有阿姨推著車子送到你座位上的,有可能是水果拼盤,有可能是雞腿雞翅,有可能是蛋糕蛋撻等等,每天不一樣。但基本上不會(huì)是那種讓人沒有食欲的東西。
一個(gè)公司的氛圍怎么樣,很大程度取決于創(chuàng)始人怎么樣。結(jié)合這段時(shí)間在公司的經(jīng)歷,一鳴同學(xué)的全員會(huì),讓我對(duì)公司還是比較有信心的。
最后,來不來,當(dāng)然取決于你,畢竟每個(gè)人 Value 的東西不一樣。
我經(jīng)常跟同事或非同事朋友都說,除非發(fā)生意外,否則我不會(huì)跳槽到別的公司,這也是真心話。
如題,網(wǎng)上查的方法基本都過時(shí)了。
小米應(yīng)用商店老是代替 PLAY 商店跳出來,然后說沒有這個(gè)應(yīng)用,好坑。
xiaomi.eu 的版本也用過了,干凈是干凈,不過缺失了好多東西,也是不方便。
使用 android studio 開發(fā) android 項(xiàng)目,新建一個(gè)項(xiàng)目,有一個(gè) Mixnum API Level 下拉選項(xiàng),猜測(cè)是安卓開發(fā)的最小 sdk 版本。
各位建議是選哪個(gè)?我憑感覺,應(yīng)該選 7.0
在 kotlin 中有必要用常量注解嗎?如果需要用下面的常量類用 kotlin 應(yīng)該怎么寫呢,直接轉(zhuǎn)換 kotlin 會(huì)報(bào)錯(cuò)。 import androidx.annotation.StringDef; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author Luke * @version 1.0.0 * @time 2020/7/13 2:14 PM * @description 常量池 */ public class Constant { @IntDef({ AlertCode.SYSTEM, }) @Documented @Retention(RetentionPolicy.SOURCE) @Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD}) public @interface AlertCode { int SYSTEM = 0; } }
先說結(jié)論
MVP 本質(zhì): 是廣義上的架構(gòu)模式 ,適用于面向?qū)嶓w或虛擬用戶接口的開發(fā)。 它主要是在 MVC 的背景下,通過 依賴倒置 ,來解決 邏輯復(fù)用 難、 實(shí)現(xiàn)更替 難 的問題。
MVVM 本質(zhì): 是狹義上的架構(gòu)模式,專用于頁(yè)面開發(fā) 。 它主要是在多人協(xié)作的軟件工程的背景下,通過只操作 ViewModel 中映射的視圖數(shù)據(jù) 來刷新視圖狀態(tài),以此來解決 視圖調(diào)用的一致性問題 從而規(guī)避不可預(yù)期的錯(cuò)誤。
所以二者的區(qū)別是什么?
區(qū)別就在于:
一個(gè)是廣義上的架構(gòu) : 你可以通過同一套邏輯去驅(qū)動(dòng)不同品牌設(shè)備的實(shí)體用戶接口(比如不同品牌的耳機(jī)線控),或虛擬用戶接口(比如 Android 視圖,但存在一致性問題而不推薦);
一個(gè)是狹義上的架構(gòu) : 專用于可視化頁(yè)面的開發(fā),通過解決一致性問題 來規(guī)避不可預(yù)期的錯(cuò)誤。
所以輕易地你就可發(fā)現(xiàn),二者分別適用于 在各自的專場(chǎng)下 解決不同的問題,根本沒有可比性,更沒有所謂的 誰“好”誰“壞” 之分。
而且除了沒有可比性,二者之間其實(shí)也沒任何關(guān)系,MVP 的特質(zhì)是 依賴倒置 ,MVVM 的特質(zhì)是 數(shù)據(jù)驅(qū)動(dòng) ,二者沒有說誰演化自誰的關(guān)系?;氐絼倓偹f的:“根本就是 特定場(chǎng)景下解決特定問題 的兩種截然不同的架構(gòu)模式”。 沒有所謂的 MVVM == MVP + DataBinding,正如沒有所謂的 雷峰塔 == 雷鋒 + 塔。
完整原文:
https://juejin.im/post/5f03ef91f265da22df3ccc5a
版權(quán)聲明
本文以 CC 署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際協(xié)議 發(fā)行。
Copyright ? 2019-present KunMinX
原本用的 magisk Riru Location Report Enable 模塊,之前簡(jiǎn)中一直能正常使用,早上一覺醒來,劃到負(fù)一屏,什么都沒有了,顯示無法使用探索功能,Google 主應(yīng)用打開也是空白切換系統(tǒng)語言為英語和繁體中文后能正常使用,切回簡(jiǎn)中還是空白 嘗試拔卡飛行模式換成英文清空 Google 應(yīng)用數(shù)據(jù)掛美國(guó) IP 刷出 feed 后再切回簡(jiǎn)中等一系列操作,還是不行 難道是 Google 把對(duì)簡(jiǎn)中的支持取消了? 手機(jī)是一加 5T 刷 PixelExperience Android Q 有沒有用 pixel 或者刷類原生系統(tǒng)的朋友知道這是什么情況?
詳情請(qǐng)戳-> https://www.androidweekly.io/android-dev-weekly-issue-288/
歡迎關(guān)注公眾號(hào):
主界面,也就是用戶打開后加載一會(huì)出現(xiàn)的界面,或者是登錄之后顯示的界面。 我觀察了國(guó)內(nèi)很多 app 界面,基本上都是一個(gè) Activity 包裹 5 個(gè)以內(nèi)的 Fragment,通過上下按鈕切換來切換去。這種設(shè)計(jì)風(fēng)格搞起來會(huì)不會(huì)因?yàn)榧虞d多個(gè) fragment 的內(nèi)容會(huì)導(dǎo)致運(yùn)行緩慢卡頓?
除了這種界面風(fēng)格,還有哪些不同手機(jī)界面風(fēng)格的設(shè)計(jì)?
最近編譯源碼 Android9.0
在 mk 里面遇到一個(gè)奇怪的注釋:
IoStats are parcelable types (vs. interface types), but the build system uses an initial I as a magic marker to mean "interface", and due to this ends up refusing to compile these files as part of the build process.
A clean solution to this is actively being worked on by the build team, but is not yet available, so for now we just filter the files out by hand. *
car_lib_sources := $(filter-out src/android/car/storagemonitoring/IoStats.aidl,$(car_lib_sources)) car_lib_sources := $(filter-out src/android/car/storagemonitoring/IoStatsEntry.aidl,$(car_lib_sources)) public final class IoStatsEntry implements Parcelable { ...省略代碼 } public class IoStats implements Parcelable { ...省略代碼 }
為什么在編譯的時(shí)候,把這兩個(gè) I 開頭的 aidl 文件過濾掉?這個(gè)是系統(tǒng)的規(guī)則嘛?