android tv安装应用未安装,Android 客户端自动升级代码及“应用程序未安装”的解决办法...

下载apk到sd卡中需要在manifest.xml设置权限

调试的时候能正常下载新版程序,但是在打开安装时一直提示“应用程序未安装”,纠结了半天终于发现是程序的签名问题。 手机安装的apk签名要与新下载的apk签名保持一致才能更新。

eclipse环境下打包用于更新的新版本时在项目上右键选择“Android Tool” – “Export Signed Application Package”

使用默认的debug签名,我的debug签名路径为C:\Users\Administrator\.android\debug.keystore

debug.keystore 默认密码为 android

也可以创建自己的签名 但要注意旧新版本的apk签名必须保持一致。

下面贴出我的版本更新类

GetVersion.java

//获取当前apk版本

package com.maimaicha.Utils;

import com.maimaicha.Core.Const;

import android.content.Context;

import android.content.pm.PackageManager.NameNotFoundException;

import android.util.Log;

/**

* 获取版本号及版本名称

* @author Tyler

*

*/

public class GetVersion

{

private static final String TAG = "Version";

/**

* 获取版本ID

* @param context

* @return

*/

public static int getVerCode(Context context) {

int verCode = -1;

try {

verCode = context.getPackageManager().getPackageInfo(

Const.getPackage, 0).versionCode;

} catch (NameNotFoundException e) {

Log.e(TAG, e.getMessage());

}

return verCode;

}

/**

* 获取版面名称

* @param context

* @return

*/

public static String getVerName(Context context) {

String verName = "";

try {

verName = context.getPackageManager().getPackageInfo(

Const.getPackage, 0).versionName;

} catch (NameNotFoundException e) {

Log.e(TAG, e.getMessage());

}

return verName;

}

}

AppStartActivity.java

// 程序启动类

package com.maimaicha.Activity;

import com.maimaicha.Core.DBHelper;

import com.maimaicha.Core.MessageActivity;

import com.maimaicha.Utils.MMCDialog;

import com.maimaicha.Utils.NetUtil;

import com.maimaicha.Utils.GetVersion;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.os.Handler;

public class AppStartActivity extends Activity

{

private final int SPLASH_DISPLAY_LENGHT = 3000; // 延迟三秒

private UpdateManager mUpdateManager;

@Override

protected void onCreate(Bundle savedInstanceState)

{

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.welcom);

MessageActivity.addActivity(this);

new Handler().postDelayed(new Runnable()

{

public void run()

{

if (NetUtil.isNetworkAvailable(AppStartActivity.this))

{

if (NetUtil.pingIpAddr("123.232.103.193"))//api服务器IP地址

{

// 这里来检测版本是否需要更新

int versioncode = GetVersion.getVerCode(AppStartActivity.this);

if (versioncode < 1)// 这里2更改为API返回版本号

{

mUpdateManager = new UpdateManager(AppStartActivity.this);

mUpdateManager.checkUpdateInfo();

} else

{

Intent mainIntent = new Intent(AppStartActivity.this, HomeActivity.class);

AppStartActivity.this.startActivity(mainIntent);

DBHelper.DBopenorclose(AppStartActivity.this, 1);

AppStartActivity.this.finish();

}

} else

{

// 弹出警告

MMCDialog.Detect_network_dialog(AppStartActivity.this, R.string.operate, R.string.internetError, R.string.outapply);

}

} else

{

// 弹出警告

MMCDialog.Detect_network_dialog(AppStartActivity.this, R.string.operate, R.string.internetError, R.string.outapply);

}

}

}, SPLASH_DISPLAY_LENGHT);

}

}

UpdateManager.java

//下载apk 更新应用操作类

package com.maimaicha.Activity;

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 com.maimaicha.Core.DBHelper;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Dialog;

import android.app.AlertDialog.Builder;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.DialogInterface.OnClickListener;

import android.net.Uri;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.ProgressBar;

import android.widget.Toast;

public class UpdateManager {

private Context mContext;

//提示语

private String updateMsg = "有最新的软件包哦,快下载吧~";

//返回的安装包url

private String apkUrl = "http://www.maimaicha.com/maimaicha.apk";

private Dialog noticeDialog;

private Dialog downloadDialog;

/* 下载包安装路径 */

private static final String savePath = "/sdcard/download/";

private static final String saveFileName = savePath + "maimaicha.apk";

/* 进度条与通知ui刷新的handler和msg常量 */

private ProgressBar mProgress;

private static final int DOWN_UPDATE = 1;

private static final int DOWN_OVER = 2;

private int progress;

private Thread downLoadThread;

private boolean interceptFlag = false;

private Handler mHandler = new Handler(){

public void handleMessage(Message msg) {

switch (msg.what) {

case DOWN_UPDATE:

mProgress.setProgress(progress);

break;

case DOWN_OVER:

installApk();

break;

default:

break;

}

};

};

public UpdateManager(Context context) {

this.mContext = context;

}

//外部接口让主Activity调用

public void checkUpdateInfo(){

showNoticeDialog();

}

private void showNoticeDialog(){

AlertDialog.Builder builder = new Builder(mContext);

builder.setTitle("软件版本更新");

builder.setMessage(updateMsg);

builder.setPositiveButton("下载", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

showDownloadDialog();

}

});

builder.setNegativeButton("以后再说", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

Intent mainIntent = new Intent(mContext, HomeActivity.class);

mContext.startActivity(mainIntent);

DBHelper.DBopenorclose(mContext, 1);

((Activity) mContext).finish();

}

});

noticeDialog = builder.create();

noticeDialog.show();

}

private void showDownloadDialog(){

AlertDialog.Builder builder = new Builder(mContext);

builder.setTitle("软件版本更新");

final LayoutInflater inflater = LayoutInflater.from(mContext);

View v = inflater.inflate(R.layout.progress, null);

mProgress = (ProgressBar)v.findViewById(R.id.progress);

builder.setView(v);

builder.setNegativeButton("取消", new OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

interceptFlag = true;

Intent mainIntent = new Intent(mContext, HomeActivity.class);

mContext.startActivity(mainIntent);

DBHelper.DBopenorclose(mContext, 1);

((Activity) mContext).finish();

}

});

downloadDialog = builder.create();

downloadDialog.show();

downloadApk();

}

private Runnable mdownApkRunnable = new Runnable() {

@Override

public void run() {

try {

URL url = new URL(apkUrl);

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

conn.connect();

int length = conn.getContentLength();

InputStream is = conn.getInputStream();

File file = new File(savePath);

if(!file.exists()){

file.mkdir();

}

String apkFile = saveFileName;

File ApkFile = new File(apkFile);

FileOutputStream fos = new FileOutputStream(ApkFile);

int count = 0;

byte buf[] = new byte[1024];

do{

int numread = is.read(buf);

count += numread;

progress =(int)(((float)count / length) * 100);

//更新进度

mHandler.sendEmptyMessage(DOWN_UPDATE);

if(numread <= 0){

//下载完成通知安装

mHandler.sendEmptyMessage(DOWN_OVER);

break;

}

fos.write(buf,0,numread);

}while(!interceptFlag);//点击取消就停止下载.

fos.close();

is.close();

} catch (MalformedURLException e) {

e.printStackTrace();

} catch(IOException e){

Log.e("aaaaaaaa", e.toString());

e.printStackTrace();

}

}

};

/**

* 下载apk

* @param url

*/

private void downloadApk(){

downLoadThread = new Thread(mdownApkRunnable);

downLoadThread.start();

}

/**

* 安装apk

* @param url

*/

private void installApk(){

File apkfile = new File(saveFileName);

if (!apkfile.exists()) {

return;

}

Intent i = new Intent(Intent.ACTION_VIEW);

i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");

mContext.startActivity(i);

} }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值