JAVA_Runtime

本文介绍如何使用Java编写程序来执行命令行ping操作,通过Runtime类的exec方法调用ping命令,并从输入流中读取响应。
package com.kk.array;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class RunTimeTest {
public static void main(String[] args) {
try {
Process process =Runtime.getRuntime().exec("ping www.baidu.com");
InputStream in=process.getInputStream();
InputStreamReader sr=new InputStreamReader(new BufferedInputStream(in));
int data;
while((data=sr.read())!=-1)
System.out.print((char)data);
} catch (IOException e) {
e.printStackTrace();
}
}
}

转载于:https://www.cnblogs.com/BigIdiot/archive/2011/12/20/2294823.html

<think>嗯,用户遇到了一个Java中的SecurityException,具体是关于android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY权限的问题。首先,我需要弄清楚这个权限的作用和触发这个异常的原因。 根据引用[1],运行时权限的动态分配是通过PMS的grantRuntimePermission方法完成的,相关权限信息存放在runtime-permissions.xml中。而安装时的权限在packages.xml里。这说明ADJUST_RUNTIME_PERMISSIONS_POLICY权限可能涉及到修改运行时权限的策略,需要较高的权限等级。 接下来,用户提到的SecurityException发生在调用updatePermissionFlags时。根据引用[3],操作权限时可能需要获取PermissionData对象,如果是第一次操作该权限,会新建并存入mPermissions这个Map中。这可能意味着在操作权限标志时,系统会检查调用者是否有足够的权限。 引用[2]中提到START_ANY_ACTIVITY权限的保护级别是signature,说明只有系统签名的应用才能使用。类似地,ADJUST_RUNTIME_PERMISSIONS_POLICY可能也需要系统签名或者特殊权限,比如系统或特权应用的权限。 解决方案方面,首先用户需要确认是否在AndroidManifest.xml中声明了该权限。但由于这个权限的保护级别可能很高,普通应用可能无法直接使用。用户可能需要检查应用的签名,确保是系统应用或拥有平台签名。如果无法获得系统签名,可能需要寻找替代方法,比如通过其他API或权限来达到目的。 另外,可以考虑在调用updatePermissionFlags之前检查权限是否已被授予,或者使用ActivityCompat.requestPermissions来动态请求权限。但根据引用[1],动态请求的权限处理方式可能与系统级权限不同,所以可能不适用于这种情况。 还需要注意,某些权限可能对API级别有要求,或者仅在特定设备上可用。用户应该确认目标设备的系统版本是否支持该权限,并检查是否有其他依赖条件。 最后,如果所有方法都不可行,可能需要联系设备制造商或寻求系统级开发的解决方案,因为涉及到底层权限管理,普通应用可能无法绕过这些限制。</think>### 解决 `java.lang.SecurityException: android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY` 的步骤 #### 问题分析 该异常表明应用尝试修改运行时权限策略(如通过 `updatePermissionFlags` 方法),但未声明或未获取 `android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY` 权限。该权限属于系统级权限,普通应用无法直接使用,需满足特定条件[^1][^3]。 --- #### 解决方案 1. **确认权限声明与签名要求** - **系统级权限限制**:`ADJUST_RUNTIME_PERMISSIONS_POLICY` 是 `signature|privileged` 级别权限,仅允许系统应用或特权应用(如预装在系统分区的应用)调用[^2]。 - **检查 `AndroidManifest.xml`**:确保声明权限并标记为系统应用: ```xml <manifest ...> <uses-permission android:name="android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY" /> <!-- 声明为系统应用(需平台签名) --> <application android:systemApp="true" ...> </application> </manifest> ``` 2. **获取平台签名** - 若应用需操作此权限,必须使用与设备系统相同的签名密钥(如 AOSP 的测试密钥或厂商密钥)对 APK 签名。普通调试密钥无效。 3. **替代方案(非系统应用)** - **使用标准权限 API**:通过 `ActivityCompat.requestPermissions` 请求用户授权的普通运行时权限(如 `CAMERA`、`LOCATION`)。 - **避免直接修改权限策略**:普通应用应通过系统提供的交互流程(如系统设置)调整权限,而非直接调用底层接口。 4. **检查调用逻辑** - 确保调用 `updatePermissionFlags` 的代码逻辑仅在系统应用环境下执行,例如: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // 需系统权限 PackageManager pm = getPackageManager(); pm.updatePermissionFlags(permissionName, packageName, flagMask, flagValues); } ``` 5. **调试与日志分析** - 检查 `adb logcat` 输出的完整堆栈信息,定位触发异常的具体代码位置。 - 验证权限是否通过 `checkPermission` 返回 `PERMISSION_GRANTED`: ```java if (checkSelfPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) == PackageManager.PERMISSION_GRANTED) { // 执行操作 } ``` --- #### 根本原因 - **权限模型限制**:Android 的权限管理分为安装时权限(静态声明)和运行时权限(动态请求),而 `ADJUST_RUNTIME_PERMISSIONS_POLICY` 属于系统级策略控制权限,普通应用无操作权限。 - **签名验证机制**:系统通过 `packages.xml` 和 `runtime-permissions.xml` 文件存储权限配置,修改策略需验证应用签名和身份。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值