Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从网络位置使用Android ProcessBuilder_Android_Processbuilder - Fatal编程技术网

从网络位置使用Android ProcessBuilder

从网络位置使用Android ProcessBuilder,android,processbuilder,Android,Processbuilder,我的情况是,我有100多台android设备需要更新,它们没有连接到互联网,而是连接到本地网络。我想做的是使用process builder访问本地网络上的apk,并在没有用户干预的情况下安装apk 这些设备目前没有根目录,但是,因为我将不得不将它们全部拉入此更新中,无论如何,如果需要,它们都可以根目录 目前,我只是从一个新应用程序的onCreate进程运行,当代码运行时,我会将该应用程序作为后台服务,定期检查网络中的新文件 这是我尝试过的,但是我得到了一个IO错误,然后是设备上查找文件的位置列

我的情况是,我有100多台android设备需要更新,它们没有连接到互联网,而是连接到本地网络。我想做的是使用process builder访问本地网络上的apk,并在没有用户干预的情况下安装apk

这些设备目前没有根目录,但是,因为我将不得不将它们全部拉入此更新中,无论如何,如果需要,它们都可以根目录

目前,我只是从一个新应用程序的onCreate进程运行,当代码运行时,我会将该应用程序作为后台服务,定期检查网络中的新文件

这是我尝试过的,但是我得到了一个IO错误,然后是设备上查找文件的位置列表

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ProcessBuilder pb = new ProcessBuilder("su","-c", "'pm install -r http://192.168.0.17:8080/updateTest/my.apk'");
        try {
                Process shell = pb.start();
                InputStream shellIn = shell.getInputStream();
                String response = IOUtils.toString(shellIn, "UTF-8");
                Log.w("myApp.update", response);
                shellIn.close();
                shell.destroy();
        } catch (IOException ex) {
                Log.w("myApp.update", "failed" + ex);
        }



    }      
}
以及logcat消息:

06-26 17:00:37.886: E/myApp.update(11072): failedjava.io.IOException: Error running exec(). Command: [su, -c, 'pm install -r http://192.168.0.17:8080/updateTest/myapp.apk'] Working Directory: null Environment: [ANDROID_SOCKET_zygote=9, SECONDARY_STORAGE=/storage/extSdCard:/storage/UsbDriveA:/storage/UsbDriveB:/storage/UsbDriveC:/storage/UsbDriveD:/storage/UsbDriveE:/storage/UsbDriveF, OMX_STE_ENS_COMPONENTS_DIR=/system/lib/ste_omxcomponents/, OMX_BELLAGIO_LOADER_REGISTRY=/system/omxloaders, ANDROID_BOOTLOGO=1, EXTERNAL_STORAGE=/storage/sdcard0, ANDROID_ASSETS=/system/app, ASEC_MOUNTPOINT=/mnt/asec, PATH=/system/sbin:/system/bin:/system/xbin:/sbin:/bin:/vendor/bin, LOOP_MOUNTPOINT=/mnt/obb, BOOTCLASSPATH=/system/framework/core.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/sec_edm.jar:/system/framework/seccamera.jar, ANDROID_DATA=/data, ANDROID_ROOT=/system, LD_LIBRARY_PATH=/system/lib:/lib:/usr/lib:/system/lib/ste_omxcomponents/:/vendor/lib, ANDROID_PROPERTY_WORKSPACE=8,66560]
那么,有人对此有什么想法或经验吗

更新

好的,现在我先抓取文件,然后使用下面的代码尝试安装:

public class MainActivity extends ActionBarActivity {

    private long enqueue;
    private DownloadManager dm;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                    long downloadId = intent.getLongExtra(
                            DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                    Query query = new Query();
                    query.setFilterById(enqueue);
                    Cursor c = dm.query(query);
                    if (c.moveToFirst()) {
                        int columnIndex = c
                                .getColumnIndex(DownloadManager.COLUMN_STATUS);
                        if (DownloadManager.STATUS_SUCCESSFUL == c
                                .getInt(columnIndex)) {

                            //ImageView view = (ImageView) findViewById(R.id.imageView1);
                            String uriString = c
                                    .getString(c
                                            .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                           // view.setImageURI(Uri.parse(uriString));

                          installapk();


                        }
                    }
                }
            }

            private void installapk() {
                 ProcessBuilder pb = new ProcessBuilder("su","-c", "pm install -r " + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/sr.apk");
                    try {
                            Process shell = pb.start();
                            InputStream shellIn = shell.getInputStream();
                            String response = IOUtils.toString(shellIn, "UTF-8");
                            Log.e("myApp.update", response);
                            shellIn.close();
                            shell.destroy();
                    } catch (IOException ex) {

                            Log.e("myApp.update", "failed" + ex);
                    }
            }
        };

        registerReceiver(receiver, new IntentFilter(
                DownloadManager.ACTION_DOWNLOAD_COMPLETE));

        onClick();
    }

    public void onClick() {


      dm = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);
        DownloadManager.Request req = new DownloadManager.Request(Uri.parse("http://192.168.0.62:12345/sr.apk"));
        req.setTitle("sr.apk")
                        .setDescription("Downloading ....")
                        // download the package to the /sdcard/downlaod path.
                        .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "sr.apk");
           enqueue = dm.enqueue(req);

    }



}      
然而,我仍然得到相同的错误!设备已根目录,我的权限如下:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

有人看到我做错了什么吗?

您要在哪个目录下执行?您是否尝试使用
pb.directory(“/home”)设置目录?说得好!我想我需要先从服务器抓取文件,然后尝试安装它,我的逻辑有点失败“在没有用户干预的情况下安装apk”--如果没有超级用户访问,这是不可能的。这很好,如果这是你的意思,我可以根设备问最新的尝试更新!
public class MainActivity extends ActionBarActivity {

    private long enqueue;
    private DownloadManager dm;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                    Query query = new Query();
                    query.setFilterById(enqueue);
                    Cursor c = dm.query(query);
                    if (c.moveToFirst()) {
                        int columnIndex = c
                                .getColumnIndex(DownloadManager.COLUMN_STATUS);
                        if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) 
                        {
                          installapk();
                        }
                    }
                }
            }

            private void installapk() {

                    try {
                            ProcessBuilder pb = new ProcessBuilder("su","-c", "install -r " +Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/sr.apk");
                            Process shell = pb.start();
                            pb.redirectErrorStream(true);
                            InputStream shellIn = shell.getInputStream();
                            String response = IOUtils.toString(shellIn, "UTF-8");
                            Log.e("myApp.update", response);
                            shellIn.close();
                            shell.destroy();
                    } catch (IOException ex) {

                            Log.e("myApp.update", "failed" + ex);
                    }
            }
        };

        registerReceiver(receiver, new IntentFilter(
                DownloadManager.ACTION_DOWNLOAD_COMPLETE));

        onClick();
    }

    public void onClick() {


      dm = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);
        DownloadManager.Request req = new DownloadManager.Request(Uri.parse("http://192.168.0.62:12345/sr.apk"));
        req.setTitle("sr.apk").setDescription("Downloading ....").setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "sr.apk");
           enqueue = dm.enqueue(req);

    }
}