当前位置:首页 » 安卓系统 » 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 07:46:05 浏览:11
监控未配置怎么办视频 发布:2024-11-28 07:44:41 浏览:501
android获取手机的ip 发布:2024-11-28 07:42:13 浏览:170
python打开文件窗口 发布:2024-11-28 07:36:13 浏览:555
cpu二级缓存的作用 发布:2024-11-28 07:36:12 浏览:1001
net数据库控件 发布:2024-11-28 07:32:58 浏览:99
我的世界国际服创建服务器pc 发布:2024-11-28 07:20:53 浏览:773
编译原理LR分析法pdf 发布:2024-11-28 07:17:41 浏览:264
安卓光遇版本怎么看 发布:2024-11-28 06:29:52 浏览:871
oraclesql加密 发布:2024-11-28 06:29:15 浏览:901