當前位置:首頁 » 安卓系統 » androidsdkint

androidsdkint

發布時間: 2024-03-07 09:09:23

Ⅰ 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官方大力支持的影響,更新速度非常快,操作簡單,推薦使用。

  1. 打開android studio

    ·


  2. 對號入座,一一更新即可。

最後

推薦使用第一種方案,其他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文件中添加

(2). 修改APK為系統許可權,將APK放到源碼編譯

(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的就沒去做測試了。

  • 補充說明:

  1. 利用TakeScreenShotService截圖Android手機一般都自帶有手機屏幕截圖的功能:在手機任何界面(當然手機要是開機點亮狀態),通過按組合鍵,屏幕閃一下,然後咔嚓一聲,截圖的照片會保存到當前手機的圖庫中,

  2. 對手機android源碼中通過組合鍵屏幕截圖的整個流程有個大體了解了,在改動中熟悉按鍵的捕獲原理,並且清楚調用的截屏函數介面即可。

熱點內容
有文件夾刪不掉怎麼辦 發布:2024-11-28 06:22:50 瀏覽:526
python3怎麼用 發布:2024-11-28 06:10:58 瀏覽:255
安卓盒子內存小怎麼辦 發布:2024-11-28 06:10:57 瀏覽:809
車企減配哪些配置好 發布:2024-11-28 05:55:18 瀏覽:674
傳說對決上傳照片 發布:2024-11-28 05:49:18 瀏覽:465
解壓筆怎麼畫 發布:2024-11-28 05:49:17 瀏覽:518
預編譯查詢 發布:2024-11-28 05:32:35 瀏覽:313
山東青島iptv設置密碼是多少 發布:2024-11-28 05:30:26 瀏覽:316
小鵬的解壓 發布:2024-11-28 05:10:07 瀏覽:22
ibm存儲售後 發布:2024-11-28 05:00:39 瀏覽:32