Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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上通过网络编程自升级自己的apk_Android_Apk - Fatal编程技术网

在android上通过网络编程自升级自己的apk

在android上通过网络编程自升级自己的apk,android,apk,Android,Apk,我们必须把我们的软件移植到android上。我们的软件的一个主要功能应该是,该软件可以从网络(我们自己的服务器)下载自己的新版本,并安装它的新版本。所有这一切都应该通过编程来完成 我是android新手,所以不知道该怎么做 如何创建apk?-解决 如何签署apk?-解决 如何下载apk?-解决 如何复制下载的文件覆盖/data/apk/my.software.name.apk?-未解决 如何按正在运行的版本重新启动软件?-未解决 您不必这样做。你只需将你的程序的新版本上传到Android Ma

我们必须把我们的软件移植到android上。我们的软件的一个主要功能应该是,该软件可以从网络(我们自己的服务器)下载自己的新版本,并安装它的新版本。所有这一切都应该通过编程来完成

我是android新手,所以不知道该怎么做

  • 如何创建apk?-解决
  • 如何签署apk?-解决
  • 如何下载apk?-解决
  • 如何复制下载的文件覆盖/data/apk/my.software.name.apk?-未解决
  • 如何按正在运行的版本重新启动软件?-未解决

    • 您不必这样做。你只需将你的程序的新版本上传到Android Market上,人们就会立刻看到它。选中“自动更新”选项自动升级程序的用户,无需明确同意;其他人看到“升级可用”,只需单击“升级”即可升级到程序的新版本

      如果出于某种原因,您认为您想在征得或未经用户同意的情况下强制用户更新,那么您就不能这样做。您可以下载apk,并且应该能够将其交给软件包管理器,软件包管理器将要求用户确认他们是否确实想要安装它,然后再次确认,因为您需要用户在开发选项中选中“允许未知源”选项,否则软件包管理器将完全拒绝这样做。但是,如果用户没有明确请求,或者没有明确允许通过市场自动更新,android将不允许您安装新软件包

      如果您存在某种类型的向后兼容性问题,并且希望不允许运行不推荐使用的应用程序版本,则可以在应用程序中嵌入一些逻辑,这些逻辑将检查服务器上的版本信息,并在过时时终止,并显示一条消息“此版本已过时,您需要升级才能继续使用此应用程序”或其他内容。但用户后面没有升级

      File File=新文件(dir,“App.apk”)

      意向意向=新意向(意向.行动\视图)

      intent.setDataAndType(Uri.fromFile(文件), “application/vnd.android.package归档文件”)

      星触觉(意向)


      我也遇到了同样的问题,经过几次尝试后,它以这种方式对我起了作用。之前,我从Web服务获得了新的apk。

      很抱歉给您带来不便,这是代码,我还发布了使用它所需的XML权限

      package com.SelfInstall01;
      
      import java.io.ByteArrayOutputStream;
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.net.HttpURLConnection;
      import java.net.MalformedURLException;
      import java.net.URL;
      import java.util.ArrayList;
      import java.util.List;
      import com.SelfInstall01.SelfInstall01Activity;
      import android.app.Activity;
      import android.app.AlertDialog;
      import android.app.Dialog;
      import android.app.AlertDialog.Builder;
      import android.content.DialogInterface;
      import android.content.Intent;
      import android.content.pm.PackageInfo;
      import android.net.Uri;
      import android.os.Bundle;
      import android.os.Environment;
      import android.view.View;
      import android.view.View.OnClickListener;
      import android.widget.Button;
      import android.widget.TextView;
      import android.widget.Toast;
      
      public class SelfInstall01Activity extends Activity 
      {
          class PInfo {
              private String appname = "";
              private String pname = "";
              private String versionName = "";
              private int versionCode = 0;
              //private Drawable icon;
              /*private void prettyPrint() {
                  //Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode);
              }*/
          }
          public int VersionCode;
          public String VersionName="";
          public String ApkName ;
          public String AppName ;
          public String BuildVersionPath="";
          public String urlpath ;
          public String PackageName;
          public String InstallAppPackageName;
          public String Text="";
      
          TextView tvApkStatus;
          Button btnCheckUpdates;
          TextView tvInstallVersion;
      
          /** Called when the activity is first created. */
          @Override
          public void onCreate(Bundle savedInstanceState) 
          {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.main);
      
              //Text= "Old".toString();
              Text= "New".toString();
      
      
              ApkName = "SelfInstall01.apk";//"Test1.apk";// //"DownLoadOnSDcard_01.apk"; //      
              AppName = "SelfInstall01";//"Test1"; //
      
              BuildVersionPath = "http://10.0.2.2:82/Version.txt".toString();
              PackageName = "package:com.SelfInstall01".toString(); //"package:com.Test1".toString();
              urlpath = "http://10.0.2.2:82/"+ Text.toString()+"_Apk/" + ApkName.toString();
      
              tvApkStatus =(TextView)findViewById(R.id.tvApkStatus);
              tvApkStatus.setText(Text+" Apk Download.".toString());
      
      
              tvInstallVersion = (TextView)findViewById(R.id.tvInstallVersion);
              String temp = getInstallPackageVersionInfo(AppName.toString());
              tvInstallVersion.setText("" +temp.toString());
      
              btnCheckUpdates =(Button)findViewById(R.id.btnCheckUpdates);
              btnCheckUpdates.setOnClickListener(new OnClickListener() 
              {       
                  @Override
                  public void onClick(View arg0) 
                  {
                      GetVersionFromServer(BuildVersionPath); 
      
                      if(checkInstalledApp(AppName.toString()) == true)
                      {   
                          Toast.makeText(getApplicationContext(), "Application Found " + AppName.toString(), Toast.LENGTH_SHORT).show();
      
      
                      }else{
                          Toast.makeText(getApplicationContext(), "Application Not Found. "+ AppName.toString(), Toast.LENGTH_SHORT).show();          
                      }               
                  }
              });
      
          }// On Create END.
      
          private Boolean checkInstalledApp(String appName){
              return getPackages(appName);    
          }
      
          // Get Information about Only Specific application which is Install on Device.
          public String getInstallPackageVersionInfo(String appName) 
          {
              String InstallVersion = "";     
              ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */
              final int max = apps.size();
              for (int i=0; i<max; i++) 
              {
                  //apps.get(i).prettyPrint();        
                  if(apps.get(i).appname.toString().equals(appName.toString()))
                  {
                      InstallVersion = "Install Version Code: "+ apps.get(i).versionCode+
                          " Version Name: "+ apps.get(i).versionName.toString();
                      break;
                  }
              }
      
              return InstallVersion.toString();
          }
          private Boolean getPackages(String appName) 
          {
              Boolean isInstalled = false;
              ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */
              final int max = apps.size();
              for (int i=0; i<max; i++) 
              {
                  //apps.get(i).prettyPrint();
      
                  if(apps.get(i).appname.toString().equals(appName.toString()))
                  {
                      /*if(apps.get(i).versionName.toString().contains(VersionName.toString()) == true &&
                              VersionCode == apps.get(i).versionCode)
                      {
                          isInstalled = true;
                          Toast.makeText(getApplicationContext(),
                                  "Code Match", Toast.LENGTH_SHORT).show(); 
                          openMyDialog();
                      }*/
                      if(VersionCode <= apps.get(i).versionCode)
                      {
                          isInstalled = true;
      
                          /*Toast.makeText(getApplicationContext(),
                                  "Install Code is Less.!", Toast.LENGTH_SHORT).show();*/
      
                          DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() 
                          {
                              @Override
                              public void onClick(DialogInterface dialog, int which) {
                                  switch (which)
                                  {
                                  case DialogInterface.BUTTON_POSITIVE:
                                      //Yes button clicked
                                      //SelfInstall01Activity.this.finish(); Close The App.
      
                                      DownloadOnSDcard();
                                      InstallApplication();
                                      UnInstallApplication(PackageName.toString());
      
                                      break;
      
                                  case DialogInterface.BUTTON_NEGATIVE:
                                      //No button clicked
      
                                      break;
                                  }
                              }
                          };
      
                          AlertDialog.Builder builder = new AlertDialog.Builder(this);
                          builder.setMessage("New Apk Available..").setPositiveButton("Yes Proceed", dialogClickListener)
                              .setNegativeButton("No.", dialogClickListener).show();
      
                      }    
                      if(VersionCode > apps.get(i).versionCode)
                      {
                          isInstalled = true;
                          /*Toast.makeText(getApplicationContext(),
                                  "Install Code is better.!", Toast.LENGTH_SHORT).show();*/
      
                          DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() 
                          {
                              @Override
                              public void onClick(DialogInterface dialog, int which) {
                                  switch (which)
                                  {
                                  case DialogInterface.BUTTON_POSITIVE:
                                      //Yes button clicked
                                      //SelfInstall01Activity.this.finish(); Close The App.
      
                                      DownloadOnSDcard();
                                      InstallApplication();
                                      UnInstallApplication(PackageName.toString());
      
                                      break;
      
                                  case DialogInterface.BUTTON_NEGATIVE:
                                      //No button clicked
      
                                      break;
                                  }
                              }
                          };
      
                          AlertDialog.Builder builder = new AlertDialog.Builder(this);
                          builder.setMessage("NO need to Install.").setPositiveButton("Install Forcely", dialogClickListener)
                              .setNegativeButton("Cancel.", dialogClickListener).show();              
                      }
                  }
              }
      
              return isInstalled;
          }
          private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) 
          {       
              ArrayList<PInfo> res = new ArrayList<PInfo>();        
              List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
      
              for(int i=0;i<packs.size();i++) 
              {
                  PackageInfo p = packs.get(i);
                  if ((!getSysPackages) && (p.versionName == null)) {
                      continue ;
                  }
                  PInfo newInfo = new PInfo();
                  newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
                  newInfo.pname = p.packageName;
                  newInfo.versionName = p.versionName;
                  newInfo.versionCode = p.versionCode;
                  //newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
                  res.add(newInfo);
              }
              return res; 
          }
      
      
          public void UnInstallApplication(String packageName)// Specific package Name Uninstall.
          {
              //Uri packageURI = Uri.parse("package:com.CheckInstallApp");
              Uri packageURI = Uri.parse(packageName.toString());
              Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
              startActivity(uninstallIntent); 
          }
          public void InstallApplication()
          {   
              Uri packageURI = Uri.parse(PackageName.toString());
              Intent intent = new Intent(android.content.Intent.ACTION_VIEW, packageURI);
      
      //      Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
      
              //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              //intent.setFlags(Intent.ACTION_PACKAGE_REPLACED);
      
              //intent.setAction(Settings. ACTION_APPLICATION_SETTINGS);
      
              intent.setDataAndType
              (Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/"  + ApkName.toString())), 
              "application/vnd.android.package-archive");
      
              // Not open this Below Line Because..
              ////intent.setClass(this, Project02Activity.class); // This Line Call Activity Recursively its dangerous.
      
              startActivity(intent);  
          }
          public void GetVersionFromServer(String BuildVersionPath)
          {
              //this is the file you want to download from the remote server          
              //path ="http://10.0.2.2:82/Version.txt";
              //this is the name of the local file you will create
              // version.txt contain Version Code = 2; \n Version name = 2.1;             
              URL u;
              try {
                  u = new URL(BuildVersionPath.toString());
      
                  HttpURLConnection c = (HttpURLConnection) u.openConnection();           
                  c.setRequestMethod("GET");
                  c.setDoOutput(true);
                  c.connect();
      
                  //Toast.makeText(getApplicationContext(), "HttpURLConnection Complete.!", Toast.LENGTH_SHORT).show();  
      
                  InputStream in = c.getInputStream();
      
                  ByteArrayOutputStream baos = new ByteArrayOutputStream();
      
                  byte[] buffer = new byte[1024]; //that stops the reading after 1024 chars..
                  //in.read(buffer); //  Read from Buffer.
                  //baos.write(buffer); // Write Into Buffer.
      
                  int len1 = 0;
                  while ( (len1 = in.read(buffer)) != -1 ) 
                  {               
                      baos.write(buffer,0, len1); // Write Into ByteArrayOutputStream Buffer.
                  }
      
                  String temp = "";     
                  String s = baos.toString();// baos.toString(); contain Version Code = 2; \n Version name = 2.1;
      
                  for (int i = 0; i < s.length(); i++)
                  {               
                      i = s.indexOf("=") + 1; 
                      while (s.charAt(i) == ' ') // Skip Spaces
                      {
                          i++; // Move to Next.
                      }
                      while (s.charAt(i) != ';'&& (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.'))
                      {
                          temp = temp.toString().concat(Character.toString(s.charAt(i))) ;
                          i++;
                      }
                      //
                      s = s.substring(i); // Move to Next to Process.!
                      temp = temp + " "; // Separate w.r.t Space Version Code and Version Name.
                  }
                  String[] fields = temp.split(" ");// Make Array for Version Code and Version Name.
      
                  VersionCode = Integer.parseInt(fields[0].toString());// .ToString() Return String Value.
                  VersionName = fields[1].toString();
      
                  baos.close();
              }
              catch (MalformedURLException e) {
                  Toast.makeText(getApplicationContext(), "Error." + e.getMessage(), Toast.LENGTH_SHORT).show();
                  e.printStackTrace();
              } catch (IOException e) {           
                  e.printStackTrace();
                  Toast.makeText(getApplicationContext(), "Error." + e.getMessage(), Toast.LENGTH_SHORT).show();
              }
                  //return true;
          }// Method End.
      
          // Download On My Mobile SDCard or Emulator.
          public void DownloadOnSDcard()
          {
              try{
                  URL url = new URL(urlpath.toString()); // Your given URL.
      
                  HttpURLConnection c = (HttpURLConnection) url.openConnection();
                  c.setRequestMethod("GET");
                  c.setDoOutput(true);
                  c.connect(); // Connection Complete here.!
      
                  //Toast.makeText(getApplicationContext(), "HttpURLConnection complete.", Toast.LENGTH_SHORT).show();
      
                  String PATH = Environment.getExternalStorageDirectory() + "/download/";
                  File file = new File(PATH); // PATH = /mnt/sdcard/download/
                  if (!file.exists()) {
                      file.mkdirs();
                  }
                  File outputFile = new File(file, ApkName.toString());           
                  FileOutputStream fos = new FileOutputStream(outputFile);
      
                  //      Toast.makeText(getApplicationContext(), "SD Card Path: " + outputFile.toString(), Toast.LENGTH_SHORT).show();
      
                  InputStream is = c.getInputStream(); // Get from Server and Catch In Input Stream Object.
      
                  byte[] buffer = new byte[1024];
                  int len1 = 0;
                  while ((len1 = is.read(buffer)) != -1) {
                      fos.write(buffer, 0, len1); // Write In FileOutputStream.
                  }
                  fos.close();
                  is.close();//till here, it works fine - .apk is download to my sdcard in download file.
                  // So please Check in DDMS tab and Select your Emulator.
      
                  //Toast.makeText(getApplicationContext(), "Download Complete on SD Card.!", Toast.LENGTH_SHORT).show();
                  //download the APK to sdcard then fire the Intent.
              } 
              catch (IOException e) 
              {
                  Toast.makeText(getApplicationContext(), "Error! " +
                          e.toString(), Toast.LENGTH_LONG).show();
              }           
          }
      }
      
      package com.SelfInstall01;
      导入java.io.ByteArrayOutputStream;
      导入java.io.File;
      导入java.io.FileOutputStream;
      导入java.io.IOException;
      导入java.io.InputStream;
      导入java.net.HttpURLConnection;
      导入java.net.MalformedURLException;
      导入java.net.URL;
      导入java.util.ArrayList;
      导入java.util.List;
      导入com.SelfInstall01.SelfInstall01活动;
      导入android.app.Activity;
      导入android.app.AlertDialog;
      导入android.app.Dialog;
      导入android.app.AlertDialog.Builder;
      导入android.content.DialogInterface;
      导入android.content.Intent;
      导入android.content.pm.PackageInfo;
      导入android.net.Uri;
      导入android.os.Bundle;
      导入android.os.Environment;
      导入android.view.view;
      导入android.view.view.OnClickListener;
      导入android.widget.Button;
      导入android.widget.TextView;
      导入android.widget.Toast;
      公共类selfinstall01活动扩展活动
      {
      班品福{
      私有字符串appname=“”;
      私有字符串pname=“”;
      私有字符串versionName=“”;
      私有int versionCode=0;
      //私人绘图图标;
      /*私有无效预打印(){
      //Log.v(appname+“\t”+pname+“\t”+versionName+“\t”+versionCode);
      }*/
      }
      公共内部版本代码;
      公共字符串VersionName=“”;
      公共字符串ApkName;
      公共字符串AppName;
      公共字符串BuildVersionPath=“”;
      公共字符串路径;
      公共字符串包名;
      公共字符串InstallAppPackageName;
      公共字符串Text=“”;
      文本视图tvApkStatus;
      按钮BTN检查更新;
      文本视图版本;
      /**在首次创建活动时调用*/
      @凌驾
      创建时的公共void(Bundle savedInstanceState)
      {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      //Text=“Old”。toString();
      Text=“New”.toString();
      ApkName=“SelfInstall01.apk”//“Test1.apk”//“downloadinsdcard\u 01.apk”///
      AppName=“SelfInstall01”/“Test1”//
      BuildVersionPath=”http://10.0.2.2:82/Version.txt“.toString();
      PackageName=“package:com.SelfInstall01.toString();/”package:com.Test1.toString();
      urlpath=”http://10.0.2.2:82/“+Text.toString()+”_Apk/“+ApkName.toString();
      tvApkStatus=(TextView)findViewById(R.id.tvApkStatus);
      tvApkStatus.setText(文本+Apk下载..toString());
      TVSInstallVersion=(TextView)findViewById(R.id.TVSInstallVersion);
      字符串temp=getInstallPackageVersionInfo(AppName.toString());
      TVSInstallVersion.setText(“+temp.toString());
      btnCheckUpdates=(按钮)findViewById(R.id.btnCheckUpdates);
      setOnClickListener(新的OnClickListener()
      {       
      @凌驾
      公共void onClick(视图arg0)
      {
      GetVersionFromServer(BuildVersionPath);
      if(checkInstalledApp(AppName.toString())==true)
      {   
      Toast.makeText(getApplicationContext(),“Application Found”+AppName.toString(),Toast.LENGTH_SHORT).show();
      }否则{
      Toast.makeText(getApplicationContext(),“未找到应用程序”。+AppName.toString(),Toast.LENGTH_SHORT).show();
      }               
      }
      });
      }//在创建端。
      专用布尔值checkInstalledApp(S)