从marketplace以外的网站以编程方式在android设备上下载、安装和删除.apk文件
从marketplace以外的网站以编程方式在android设备上下载、安装和删除.apk文件,android,onclick,apk,Android,Onclick,Apk,我开发了一些android游戏并创建了.apk文件。 我已经将这些.apk文件放在了我的网站上(比如:) 当此url从另一个应用程序访问时,是否可以直接安装此游戏onClick()event 我不希望用户下载。apk精细到他们的SD卡,然后手动安装,事实上游戏应该直接安装到设备上 我在另一个应用程序onClick()事件中尝试了以下代码: Intent goToMarket = new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://ww
我开发了一些android游戏并创建了.apk文件。
我已经将这些.apk文件放在了我的网站上(比如:) 当此url从另一个应用程序访问时,是否可以直接安装此游戏
onClick()
event
我不希望用户下载。apk精细到他们的SD卡,然后手动安装,事实上游戏应该直接安装到设备上
我在另一个应用程序onClick()
事件中尝试了以下代码:
Intent goToMarket = new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://www.sush19.com/androidApp/apk/myGame1.apk"));
startActivity(goToMarket);
我知道上面的代码不正确。。但是,谁能对此发表评论呢?谁在为您的apk维护服务器,因为为此您必须进行一些服务器设置:将包含此apk文件的服务器上的文件夹的MIME类型设置为
.apk
和应用程序/vnd.android.package归档文件
。然后,它将在点击链接后自动安装,与google play的任何其他应用程序的安装方式类似。下面的代码允许用户在Android设备上下载、安装和删除.apk文件。
我已经创建了一个Android应用程序(比如App1),它可以在SD卡上下载其他Android应用程序。点击App1中的按钮,它将从我自己的后台网站下载.apk文件,下载完成后,它将提示用户安装最近从App1下载的应用程序,安装完成后,下载的.apk文件将从SD卡中删除
在我的App1主要活动中:我包括了按钮在我的情况下,我是从App1启动我的其他应用程序,如果没有安装在设备上,我是从我的网站下载并安装它。
按钮单击事件方法
public OnClickListener ButtonClicked = new OnClickListener() {
public void onClick(View v) {
Intent i;
PackageManager manager = getPackageManager();
try {
i = manager.getLaunchIntentForPackage("com.mycompany.mygame");
if (i == null)
throw new PackageManager.NameNotFoundException();
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
} catch (PackageManager.NameNotFoundException e) {
InstallAPK downloadAndInstall = new InstallAPK();
progress.setCancelable(false);
progress.setMessage("Downloading...");
downloadAndInstall.setContext(getApplicationContext(), progress);
downloadAndInstall.execute("http://xyz/android/gamedownload.aspx?name=mygame.apk");
}
}
};
InstallAPK类
public class InstallAPK extends AsyncTask<String,Void,Void> {
ProgressDialog progressDialog;
int status = 0;
private Context context;
public void setContext(Context context, ProgressDialog progress){
this.context = context;
this.progressDialog = progress;
}
public void onPreExecute() {
progressDialog.show();
}
@Override
protected Void doInBackground(String... arg0) {
try {
URL url = new URL(arg0[0]);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
File sdcard = Environment.getExternalStorageDirectory();
File myDir = new File(sdcard,"Android/data/com.mycompany.android.games/temp");
myDir.mkdirs();
File outputFile = new File(myDir, "temp.apk");
if(outputFile.exists()){
outputFile.delete();
}
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while ((len1 = is.read(buffer)) != -1) {
fos.write(buffer, 0, len1);
}
fos.flush();
fos.close();
is.close();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(sdcard,"Android/data/com.mycompany.android.games/temp/temp.apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error!
context.startActivity(intent);
} catch (FileNotFoundException fnfe) {
status = 1;
Log.e("File", "FileNotFoundException! " + fnfe);
}
catch(Exception e)
{
Log.e("UpdateAPP", "Exception " + e);
}
return null;
}
public void onPostExecute(Void unused) {
progressDialog.dismiss();
if(status == 1)
Toast.makeText(context,"Game Not Available",Toast.LENGTH_LONG).show();
}
}
不要忘记在AndroidManifest.xml中包含以下权限<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" />
我在Web.config文件中添加了以下代码<system.webServer>
<staticContent>
<mimeMap fileExtension=".apk"
mimeType="application/vnd.android.package-archive" />
</staticContent>
</system.webServer>
我希望这些信息对一些人有帮助。他们可以下载APK文件并从SD或电话安装。谢谢您的回答。下载APK文件并从SD卡安装它们工作正常。但是我不想直接下载
.apk
文件,我想提示用户这样说:您将要在您的设备上安装myGame1
,确定
或取消
,然后单击确定
游戏应该以我们从marketplace安装应用程序的方式安装到设备上。嗨!谢谢你的回复。。。我正在管理服务器,正如您所说,我已经设置了MIME设置,为apk文件夹添加了.apk
作为扩展名和MIME
作为application/vnd.android.package archive
。我正在本地服务器上进行尝试,.apk
url是http://192.168.0.4/Sush19/games/apk/myGame1.apk
。我已将onClick事件的代码编写为:Intent promptInstall=newintent(Intent.ACTION\u视图).setData(Uri.parse()http://192.168.0.4/Sush19/games/apk/myGame1.apk")); 星触觉(PrompInstall)代码>它不会安装应用程序,它会将应用程序下载到SD卡,然后提示安装它…嗯..是的,好吧,它只会以这种方式运行。唯一的区别是,现在您不必通过文件资源管理器或任何东西在sd卡上访问或找到您的.apk文件来安装它。但通过这样做,Android会在下载文件并要求您安装后立即知道如何处理该文件。。如果您想从marketplace安装任何应用程序,它不会下载SD卡中的.apk文件,而是会提示您直接从marketplace服务器安装该应用程序。。。和我想做的一样。。是否有可能?即使您从marketplace安装应用程序,它也总是先下载.apk,然后再安装。唯一的问题是,它不会将其保存在SD卡上,而是保存在../data文件夹中,在您的手机扎根之前,您无法访问该文件夹。安装时,您可以在通知区域看到此过程,它总是说下载..然后安装..因此,如果您不想在sd卡上保留.apk,您可能需要解决问题,并在安装后以编程方式删除文件..能否共享此方法-getApplicationName(context,intent.getData().toString()),PackageManager.GET_UNINSTALLED_PACKAGES)它显示“包安装程序已停止”。如何解决这个问题?
public partial class marketplace : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DirectoryInfo directory = new DirectoryInfo(Server.MapPath("~/Android/Games"));
int counter = 0;
foreach (FileInfo file in directory.GetFiles())
{
HyperLink link = new HyperLink();
link.ID = "Link" + counter++;
link.Text = file.Name;
link.NavigateUrl = "gamedownload.aspx?name=" + file.Name;
Page.Controls.Add(link);
Page.Controls.Add(new LiteralControl("<br/>"));
}
}
protected void Click(object sender, EventArgs e)
{
Response.Redirect("gamedownload.aspx");
}
}
public partial class gamedownload : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string fileName = Request.QueryString["name"].ToString();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.TransmitFile(Server.MapPath("~/Android/Games/" + fileName));
Response.End();
}
}
<system.webServer>
<staticContent>
<mimeMap fileExtension=".apk"
mimeType="application/vnd.android.package-archive" />
</staticContent>
</system.webServer>