androidsdkint
Ⅰ Android中系統應用對WebView的適配
Android 4.4 開始修改了瀏覽器的內核導致從5.0 開始,如果App為系統應用或者Root用戶,將無法使用WebView進行載入網頁的操作
錯誤日誌如下:
java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes
針對錯誤修改方法:
1,替換WebView 如果只支持簡單的
2,可以嘗試分離把引用系統許可權的部分分離成獨立的app進行獨立維護
3, 如果是定製版系統可以修改FrameWork層,注釋掉相應的異常
public static void hookWebView() {
int sdkInt = Build.VERSION.SDK_INT;
try {
Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");
Field field = factoryClass.getDeclaredField("sProviderInstance");
field.setAccessible(true);
Object sProviderInstance = field.get(null);
if (sProviderInstance != null) {
Log.i("thi","sProviderInstance isn't null");
return;
}
Method getProviderClassMethod;
if (sdkInt > 22) {
getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");
} else if (sdkInt == 22) {
getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
} else {
return;
}
getProviderClassMethod.setAccessible(true);
Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");
Constructor<?> providerConstructor = providerClass.getConstructor(delegateClass);
if (providerConstructor != null) {
providerConstructor.setAccessible(true);
Constructor<?> declaredConstructor = delegateClass.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
sProviderInstance = providerConstructor.newInstance(declaredConstructor.newInstance());
field.set("sProviderInstance", sProviderInstance);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
Ⅱ 游戲顯示為安卓舊版本打造怎麼辦
說明你現在的安卓系統太新了,已經和你目前運行的游戲不兼容了。你可以這樣做,找一找這個游戲兼容性更高的下載資源,總有和目前系統兼容的下載資源。
最近,谷歌在一份文件中提示,Android 4.1及其以前版本的應用將無法在Android P上運行。之前IT之家報道了谷歌將在安卓9.0中限制應用的API的訪問許可權。並且新提交到Play商店的應用必須針對不超過一年以前的安卓版本,即安卓8.0。
最新的細節顯示,谷歌在SDK中增加了一項MIN_SUPPORTED_TARGET_SDK_INT,規定了應用程序支持的最低SDK版本。低於該版本的應用程序將無法安裝、運行。在Android P(安卓9.0)中,最低SDK版本為v17,即Android 4.2。
有外媒在虛擬機中進行了試驗。在虛擬機上運行的預覽版Android 9.0系統上,舊版本的應用仍舊安裝、使用,但在該應用打開時,系統會提示警告稱該應用可能無法正常運行。目前尚未清楚,在正式版的Android P系統中,谷歌是否會徹底封殺這些舊版應用。
Ⅲ android studio 怎麼更新sdk
android studio 更新 sdk的方法有3種。
方案一:
通過android studio 內置的 sdk 菜單進行更新。
方案二:
通過打開sdk安裝目錄,打開sdk應用進行更新。
方案三:
離線更新,把提前下好的安裝包安裝相應的順序存放到相應的安裝目錄下。
主要原理:
不管是離線更新,還是其他2種在線更新的方案,都是下載相應的資源組件整合到搜昌安裝目錄下,每個仔賀方案都能達到這種效果,其中方案3,請謹慎使用,離線安裝固然下載快,但是容易存放錯位置或者漏放資源,導致更新失敗。
詳細解決步奏:
方案一:
缺點:受自身網路影響。
另外:當前在android studio 受到google官方大力支持的影響,更新速度非常快,操作簡單,推薦使用。
打開android studio
·
對號入座,一一更新即可。
最後
推薦使用第一種方案,其他2種受網路和操作問題,容易更新出錯。
Ⅳ Android中如何使用代碼打開各種類型的文件
在安卓中打開音樂、視頻、圖片、文檔等文件是需要有讀取SD卡許可權的,如果是6.0以下的系統,則直接在清單文件中聲明SD卡讀取許可權即可;如果是6.0或以上,則需要動態申請許可權。
在7.0以下中打開文件時,通過intent調用系統安裝得人軟體打開文件就好了,但是在android7.0及以上的機子上這么做會報android.os.FileUriExposedException錯誤,
1)讀取SD卡
2)動態申請許可權
//設備API大於6.0時,主動申請許可權(讀取文件的許可權)
public static void requestPermission(Activity context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
}
}
}
3)讀取文件
intent = OpenFileUtil.openFile(filePath+"/"+FileName+"."+end);
使用OpenFileUtil這個。鏈接: https://www.jianshu.com/p/1414101858c1
為了兼容Android7.0,獲取文件Uri需要使用到FileProvider。
1)首先是AndroidManifest文件裡面注冊FileProvider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" /> //需要自己編寫xml文件
2)provider_paths.xml文件的編寫
// .表示根目錄
3)打開文檔方式為
intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
File txtFile = new File(filePath+"/"+FileName+"."+end);
Uri contentUri = FileProvider.getUriForFile(MyApplication.getContext(), BuildConfig.APPLICATION_ID+".provider", txtFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
grantUriPermission(context, contentUri, intent);
startActivity(intent);
4)grantUriPermission方法添加許可權
private static void grantUriPermission (Context context, Uri fileUri, Intent intent) {
List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}
綜合兩種情況:
//判斷是否是AndroidN以及更高的版本,Build.VERSION_CODES.N是Android 7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
File txtFile = new File(filePath+"/"+FileName+"."+end);
Uri contentUri = FileProvider.getUriForFile(MyApplication.getContext(), BuildConfig.APPLICATION_ID+".provider", txtFile);
Log.i("文件地址:",contentUri.toString());
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
grantUriPermission(MyApplication.getContext(), contentUri, intent);
} else {
//7.0以下的可以打開文件了
intent = OpenFileUtil.openFile(filePath+"/"+FileName+"."+end);
}
MyApplication.getContext().startActivity(intent);
Ⅳ 如何在Android裡面使用代碼截屏
回答:Android SDK的截屏
方法步驟:如下
方法一:
(1)主要就是利用SDK提供的View.getDrawingCache()方法。網上已經有很多的實例了。首先創建一個android project,然後進行Layout,畫一個按鍵
HelloAndroid.java實現代碼為:packagecom.example.helloandroid;
這個代碼會在按下app中按鍵的時候自動在手機的/sdcard/目錄下生成一個時間戳命名的png截屏文件。
這種截屏有一個問題,就是只能截到一部分,比如電池指示部分就截不出來了。
(2)在APK中調用「adb shell screencap -pfilepath」 命令
該命令讀取系統的framebuffer,需要獲得系統許可權:
(1). 在AndroidManifest.xml文件中添加
(3).利用系統的API,實現Screenshot,這部分代碼是系統隱藏的,需要在源碼下編譯,
1).修改Android.mk, 添加系統許可權
LOCAL_CERTIFICATE := platform
2).修改AndroidManifest.xml 文件,添加
許可權
方法二:
Android ddmlib進行截屏
Android本地編程(Native Programming)讀取framebuffer
(1)命令行,框架的截屏功能是通過framebuffer來實現的,所以我們先來介紹一下framebuffer。
Linux FrameBuffer 本質上只是提供了對圖形設備的硬體抽象,在開發者看來,FrameBuffer 是一塊顯示緩存,往顯示緩存中寫入特定格式的數據就意味著向屏幕輸出內容。所以說FrameBuffer就是一塊白板。例如對於初始化為16 位色的FrameBuffer 來說, FrameBuffer中的兩個位元組代表屏幕上一個點,從上到下,從左至右,屏幕位置與內存地址是順序的線性關系。幀緩存有個地址,是在內存里。我們通過不停的向frame buffer中寫入數據, 顯示控制器就自動的從frame buffer中取數據並顯示出來。全部的圖形都共享內存中同一個幀緩存。
方法三:Android截屏實現思路
Android系統是基於Linux內核的,所以也存在framebuffer這個設備,我們要實現截屏的話只要能獲取到framebuffer中的數據,然後把數據轉換成圖片就可以了,android中的framebuffer數據是存放在 /dev/graphics/fb0 文件中的,所以我們只需要來獲取這個文件的數據就可以得到當前屏幕的內容。
現在我們的測試代碼運行時候是通過RC(remote controller)方式來運行被測應用的,那就需要在PC機上來訪問模擬器或者真機上的framebuffer數據,這個的話可以通過android的ADB命令來實現。
注意:
1、需要在AndroidManifest.xml中加入代碼:android:sharedUserId="android.uid.system"。
2、由於調用了@hide的API,所以編譯得時候請使用makefile編譯。或者通過在Eclipse中添加Jar文件通過編譯。
3、此代碼只在Android4.0中使用過,2.3的就沒去做測試了。
補充說明:
利用TakeScreenShotService截圖Android手機一般都自帶有手機屏幕截圖的功能:在手機任何界面(當然手機要是開機點亮狀態),通過按組合鍵,屏幕閃一下,然後咔嚓一聲,截圖的照片會保存到當前手機的圖庫中,
對手機android源碼中通過組合鍵屏幕截圖的整個流程有個大體了解了,在改動中熟悉按鍵的捕獲原理,並且清楚調用的截屏函數介面即可。