Android调用@hide系统隐藏类的几种方法

 

调用android系统隐藏的API的几种方法(以调SystemProperties这个类为例): 

1、用反射:

 
//获取系统属性
public static  String getProperty(String key, String defaultValue) {
    String value = defaultValue;
    try {
        Class<?> c = Class.forName("android.os.SystemProperties");
        Method get = c.getMethod("get", String.class, String.class);
        value = (String)(get.invoke(c, key, "unknown" ));
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        return value;
    }
}
//设置系统属性
public static void setProperty(String key, String value) {
    try {
        Class<?> c = Class.forName("android.os.SystemProperties");
        Method set = c.getMethod("set", String.class, String.class);
        set.invoke(c, key, value );
    } catch (Exception e) {
        e.printStackTrace();
    }
}

注意:编译时要注释掉  //implementation fileTree(include: ['*.jar'],dir: 'libs')

2、添加系统framework.jar

在目录下out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar改名得到 framework.jar jar包添加到lib目录并add as library,修改项目的build.gradle文件,在repositories里加入如下代码

 
allprojects {
    repositories {
        jcenter()
        google()
    }
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile){
options.compilerArgs.add(-Xbootclasspath/p:app\\libs\\framework.jar')
        }
    }
}

appbuild.gradle中添加依赖

 
dependencies {
    provided files('libs/framework.jar')
//    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:25.4.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
} 
// 作用域改为provided

3、添加layoutlib.jar依赖

修改app中gradle.build文件添加默认的layoutlib.jar(或是指定sdk添加)即可调用隐藏的api,配置如下

修改app中的build.gradle,注意在android{}之后添加如下代码

 
def getLayoutLibPath() {
    return "${android.getSdkDirectory().getAbsolutePath()}" + "/platforms/" +
            android.compileSdkVersion +"/data/layoutlib.jar"
}
//String SDK_DIR = System.getenv("ANDROID_SDK_HOME")
//if (SDK_DIR == null){
//    java.util.Properties prop = new Properties()
//    prop.load(new FileInputStream(project.rootProject.file("local.properties")))
//    SDK_DIR = prop.get("sdk.dir")
//}
dependencies {
    provided files(getLayoutLibPath())
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
//    provided files("${SDK_DIR}/platforms/android-21/data/layoutlib.jar")
}
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android 调用系统相册选择视频的方法有多种,以下是其中的几种: 1. 使用 ACTION_PICK Intent 使用 ACTION_PICK Intent 可以打开系统相册,选择视频文件并返回其 Uri。以下是示例代码: ```java Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_CODE_PICK_VIDEO); ``` 在 onActivityResult() 中,您可以获取所选视频的 Uri: ```java @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICK_VIDEO && resultCode == RESULT_OK && data != null) { Uri videoUri = data.getData(); // 处理所选视频 } } ``` 2. 使用 ACTION_GET_CONTENT Intent 使用 ACTION_GET_CONTENT Intent 也可以打开系统相册,选择视频文件并返回其 Uri。以下是示例代码: ```java Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("video/*"); startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_CODE_PICK_VIDEO); ``` 在 onActivityResult() 中,您可以获取所选视频的 Uri: ```java @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICK_VIDEO && resultCode == RESULT_OK && data != null) { Uri videoUri = data.getData(); // 处理所选视频 } } ``` 3. 使用 MediaStore.ACTION_VIDEO_CAPTURE Intent 使用 MediaStore.ACTION_VIDEO_CAPTURE Intent 可以打开系统相机应用程序,拍摄视频并返回其 Uri。以下是示例代码: ```java Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); startActivityForResult(intent, REQUEST_CODE_CAPTURE_VIDEO); ``` 在 onActivityResult() 中,您可以获取拍摄的视频的 Uri: ```java @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_CAPTURE_VIDEO && resultCode == RESULT_OK && data != null) { Uri videoUri = data.getData(); // 处理拍摄的视频 } } ``` 请注意,使用 MediaStore.ACTION_VIDEO_CAPTURE Intent 仅适用于拍摄视频,而不是选择现有视频文件。 以上是使用 Intent 调用系统相册选择视频的几种方法。您可以选择其中一种,根据您的应用程序需求进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值