我试图使一个应用程序安装apk无声。但是当我尝试的时候,它总是给出错误。我真不知道我现在该做什么。我想我已经尝试了网上发布的所有方法。谁能告诉我还有什么我应该尝试的吗?
package com.example.filetest;
import java.io.File;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewDebug.FlagToString;
import android.widget.Toast;
public class MainActivity extends Activity {
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* File file = new File("/storage/external_storage/sda1","Scratch-v0.953.apk");
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
*/
File file = new File("/storage/external_storage/sda1/FingerPCSettings");
//File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
Log.i("TAG","exists = "+file.exists());
File[] temp = file.listFiles();
if(temp==null){
Log.e("TAG","temp is null");
return;
}
InstallAPK(temp[0]);
}
public static void InstallAPK(File file){
Log.i("TAG", "install called "+file);
if(file.exists()){
try {
String command;
command = "/system/bin/pm install -r " + file.getAbsolutePath();
Log.i("TAG", "command="+command);
command = command.substring(0, 1);
Process proc = Runtime.getRuntime().exec(new String[] { command });
proc.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onResume() {
super.onResume();
Log.i("TAG", "###########RESUME CALLEd");
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
当我尝试这段代码时,我得到如下错误:
05-20 17:34:18.898: W/System.err(6272): java.io.IOException: Error running exec(). Command: [/] Working Directory: null Environment: null
05-20 17:34:18.898: W/System.err(6272): at java.lang.ProcessManager.exec(ProcessManager.java:211)
05-20 17:34:18.898: W/System.err(6272): at java.lang.Runtime.exec(Runtime.java:173)
05-20 17:34:18.898: W/System.err(6272): at java.lang.Runtime.exec(Runtime.java:128)
05-20 17:34:18.898: W/System.err(6272): at com.example.filetest.MainActivity.InstallAPK(MainActivity.java:59)
05-20 17:34:18.898: W/System.err(6272): at com.example.filetest.MainActivity.onCreate(MainActivity.java:43)
05-20 17:34:18.898: W/System.err(6272): at android.app.Activity.performCreate(Activity.java:5273)
05-20 17:34:18.898: W/System.err(6272): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
05-20 17:34:18.898: W/System.err(6272): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
05-20 17:34:18.898: W/System.err(6272): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
05-20 17:34:18.898: W/System.err(6272): at android.app.ActivityThread.access$800(ActivityThread.java:135)
05-20 17:34:18.898: W/System.err(6272): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
05-20 17:34:18.898: W/System.err(6272): at android.os.Handler.dispatchMessage(Handler.java:102)
05-20 17:34:18.898: W/System.err(6272): at android.os.Looper.loop(Looper.java:136)
05-20 17:34:18.898: W/System.err(6272): at android.app.ActivityThread.main(ActivityThread.java:5017)
05-20 17:34:18.908: W/System.err(6272): at java.lang.reflect.Method.invokeNative(Native Method)
05-20 17:34:18.908: W/System.err(6272): at java.lang.reflect.Method.invoke(Method.java:515)
05-20 17:34:18.908: W/System.err(6272): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
05-20 17:34:18.908: W/System.err(6272): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
05-20 17:34:18.908: W/System.err(6272): at dalvik.system.NativeStart.main(Native Method)
05-20 17:34:18.908: W/System.err(6272): Caused by: java.io.IOException: Permission denied
05-20 17:34:18.908: W/System.err(6272): at java.lang.ProcessManager.exec(Native Method)
05-20 17:34:18.908: W/System.err(6272): at java.lang.ProcessManager.exec(ProcessManager.java:209)
05-20 17:34:18.908: W/System.err(6272): ... 18 more
这是我的manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.filetest"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="android.uid.system"
coreApp = "true"
>
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我不知道我现在该做什么。有人知道怎么修吗? 试试这样运行命令:
Process proc = Runtime.getRuntime().exec(new String[] { command });
请使用以下代码:
Process p = Runtime.getRuntime().exec("cd " + Environment.getExternalStorageDirectory() + "/.command");
并验证您的命令构造字符串应该是正确的。在日志中打印子字符串
抛出此异常,因为您试图在根目录中创建文件。
在创建新文件时删除开头的/
,使您的路径成为相对路径:
File file = new File("storage/external_storage/sda1/FingerPCSettings");