516 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			516 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | package com.novelbook.android.upgrade; | |||
|  | 
 | |||
|  | import java.io.ByteArrayInputStream; | |||
|  | 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.HashMap; | |||
|  | 
 | |||
|  | 
 | |||
|  | import android.Manifest; | |||
|  | import android.app.Activity; | |||
|  | import android.app.AlertDialog; | |||
|  | import android.app.AlertDialog.Builder; | |||
|  | import android.app.Dialog; | |||
|  | import android.content.Context; | |||
|  | import android.content.DialogInterface; | |||
|  | import android.content.DialogInterface.OnClickListener; | |||
|  | import android.content.Intent; | |||
|  | import android.content.pm.PackageManager.NameNotFoundException; | |||
|  | import android.net.Uri; | |||
|  | import android.os.Build; | |||
|  | import android.os.Environment; | |||
|  | import android.os.Handler; | |||
|  | import android.os.Message; | |||
|  | import android.support.v4.content.FileProvider; | |||
|  | import android.text.TextUtils; | |||
|  | import android.util.Log; | |||
|  | import android.view.LayoutInflater; | |||
|  | import android.view.View; | |||
|  | import android.widget.ProgressBar; | |||
|  | import android.widget.Toast; | |||
|  | 
 | |||
|  | import com.novelbook.android.Activity_base; | |||
|  | import com.novelbook.android.BookActivity; | |||
|  | import com.novelbook.android.BuildConfig; | |||
|  | import com.novelbook.android.MyApp; | |||
|  | import com.novelbook.android.R; | |||
|  | import com.novelbook.android.ReadActivity; | |||
|  | import com.novelbook.android.db.Novel; | |||
|  | import com.novelbook.android.netsubscribe.BookSubscribe; | |||
|  | import com.novelbook.android.netutils.HttpMethods; | |||
|  | import com.novelbook.android.netutils.OnSuccessAndFaultListener; | |||
|  | import com.novelbook.android.netutils.OnSuccessAndFaultSub; | |||
|  | import com.novelbook.android.utils.CommonUtil; | |||
|  | import com.novelbook.android.utils.Constants; | |||
|  | import com.novelbook.android.utils.GsonUtil; | |||
|  | 
 | |||
|  | import okhttp3.Call; | |||
|  | import okhttp3.Callback; | |||
|  | import okhttp3.Request; | |||
|  | import okhttp3.Response; | |||
|  | import okhttp3.ResponseBody; | |||
|  | 
 | |||
|  | import static com.novelbook.android.FileActivity.EXTERNAL_STORAGE_REQ_CODE; | |||
|  | import static com.novelbook.android.netapi.URLConstant.getRootUrl; | |||
|  | import static java.lang.System.exit; | |||
|  | 
 | |||
|  | 
 | |||
|  | public class UpdateManager { | |||
|  | 
 | |||
|  | 	public static final String TAG =UpdateManager.class.getSimpleName(); | |||
|  | 
 | |||
|  | 	private static final int DOWNLOAD = 1; | |||
|  | 	private static final int DOWNLOAD_FINISH = 2; | |||
|  | 	private static final int showDialog =3; | |||
|  | 	HashMap<String, String> mHashMap; | |||
|  | 	HashMap<String, HashMap<String,String>>  multiHashMap; | |||
|  | 	private String mSavePath; | |||
|  | 	private int progress; | |||
|  | 	private boolean cancelUpdate = false; | |||
|  | 	private Activity_base mContext; | |||
|  | 	private ProgressBar mProgress; | |||
|  | 	private Dialog mDownloadDialog; | |||
|  | 	private boolean isForceRefresh; | |||
|  | 	int serviceCode; | |||
|  | 	private Handler mHandler = new Handler() | |||
|  | 	{ | |||
|  | 		@Override | |||
|  | 		public void handleMessage(Message msg) | |||
|  | 		{ | |||
|  | 			switch (msg.what) | |||
|  | 			{ | |||
|  | 			case DOWNLOAD: | |||
|  | 				mProgress.setProgress(progress); | |||
|  | 				break; | |||
|  | 			case DOWNLOAD_FINISH: | |||
|  | 				installApk(); | |||
|  | 				break; | |||
|  | 				case showDialog: | |||
|  | 					showNoticeDialog(); | |||
|  | 					break; | |||
|  | 			default: | |||
|  | 				break; | |||
|  | 			} | |||
|  | 		}; | |||
|  | 	}; | |||
|  | 
 | |||
|  | 	public UpdateManager(Activity_base context) | |||
|  | 	{ | |||
|  | 		this.mContext = context; | |||
|  | //		app =(QiYouApplication)context;  | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/** | |||
|  | 	 * 濡拷绁存潪顖欐閺囧瓨鏌<E793A8> | |||
|  | 	 */ | |||
|  | 	public void checkUpdate() | |||
|  | 	{ | |||
|  | 		  String urlStr = getRootUrl()+ Constants.VERSION_ADDRESS; | |||
|  | 		  urlStr = Constants.updateUrl;//"http://xiaoshuofenxiang.com/version.xml"; | |||
|  | 		if(!TextUtils.isEmpty(urlStr)) | |||
|  | 		  checkUpdate(urlStr); | |||
|  | 		/*if (isUpdate()) | |||
|  | 		{ | |||
|  | 			showNoticeDialog(); | |||
|  | 		} else | |||
|  | 		{ | |||
|  |  		   Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG).show(); | |||
|  | 		}*/ | |||
|  | 	} | |||
|  | 	boolean isSilence =false; | |||
|  | 	public void checkUpdateSilence() | |||
|  | 	{ | |||
|  | 		isSilence=true; | |||
|  | 		checkUpdate(); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	 | |||
|  | 	 | |||
|  | 	 | |||
|  | 	 | |||
|  | 	 | |||
|  | 	  | |||
|  | 	  void checkUpdate(String url){ | |||
|  | 		  Request request = new Request.Builder() | |||
|  | 				  .url(url).build(); | |||
|  | 
 | |||
|  | 
 | |||
|  | 		  HttpMethods.getOkClient().newCall(request).enqueue(new Callback() { | |||
|  | 			  @Override | |||
|  | 			  public void onFailure(Call call, IOException e) { | |||
|  | 				  Log.d(TAG, " 版本检查错误  onFailure(int, Header[],byte[], Throwable ) was received"); | |||
|  | 				  if(!isSilence) | |||
|  | 					  Toast.makeText(mContext, "版本检查出错了", Toast.LENGTH_LONG).show(); | |||
|  | 			  } | |||
|  | 
 | |||
|  | 			  @Override | |||
|  | 			  public void onResponse(Call call, Response response) throws IOException { | |||
|  | 				if(response.code()!=200)  { | |||
|  | 					Log.e(TAG, "check update onResponse:return code" +response.code() ); | |||
|  | 				} | |||
|  | 			  	ResponseBody body = response.body(); | |||
|  | 
 | |||
|  | 
 | |||
|  | 				  try { | |||
|  | 					  byte[] bytes = body.bytes(); | |||
|  | 				//	  String s = body.string(); | |||
|  | 				//	  Log.d(TAG, "onSuccess: response is  " + s); | |||
|  | 					  if (bytes != null) { | |||
|  | 						//  processTxtOnSuccess(bytes); | |||
|  | 						  processMultiTxtOnSuccess(bytes); | |||
|  | 					  } | |||
|  | 					//  body.close(); | |||
|  | 				  }catch (Exception e){ | |||
|  | 					  Log.e(TAG, "onResponse: ",e ); | |||
|  | 				  }finally { | |||
|  | 
 | |||
|  | 				  } | |||
|  | 			  } | |||
|  | 		   }); | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 	     | |||
|  | 	     | |||
|  | 	  } | |||
|  | 	void processMultiTxtOnSuccess(byte[] paramArrayOfByte) { | |||
|  | 
 | |||
|  | 		boolean isUpdate=false; | |||
|  | 		int versionCode = getVersionCode(mContext); | |||
|  | 		InputStream inputStream = null; | |||
|  | 		inputStream =new ByteArrayInputStream(paramArrayOfByte); | |||
|  | 		ParseXmlService service = new ParseXmlService(); | |||
|  | 		try | |||
|  | 		{ | |||
|  | 			if(inputStream!=null) | |||
|  | 				multiHashMap = service.parseMultiXml(inputStream); | |||
|  | 
 | |||
|  | 		} catch (Exception e) | |||
|  | 		{ | |||
|  | 			e.printStackTrace(); | |||
|  | 		} | |||
|  | 		if (null != multiHashMap) { | |||
|  | 			String packgename = mContext.getPackageName(); | |||
|  | 			mHashMap = multiHashMap.get(packgename); | |||
|  | 			if (mHashMap != null) { | |||
|  | 		        serviceCode = Integer.valueOf(mHashMap.get("version")); | |||
|  | 		        Constants.serverVersion = serviceCode; | |||
|  | 				if(mHashMap.containsKey("minVersion")) | |||
|  | 				Constants.minVersion = Integer.valueOf(mHashMap.get("minVersion")); | |||
|  | 				// need update or not | |||
|  | 				isUpdate =   serviceCode > versionCode; | |||
|  | 				isForceRefresh = versionCode <Constants.minVersion; | |||
|  | 
 | |||
|  | 				Log.d(TAG, String.format("processMultiTxtOnSuccess : isUpdate %s, serviceCode %s,minVersion %s,versionCode %s,isForceRefresh %s" | |||
|  | 						,isUpdate,serviceCode,Constants.minVersion,Constants.version,isForceRefresh)); | |||
|  | 
 | |||
|  | 
 | |||
|  | 			} | |||
|  | 		} | |||
|  | 
 | |||
|  | 		if (isUpdate ) | |||
|  | 		{ | |||
|  | 			mHandler.sendEmptyMessage(showDialog); | |||
|  | 
 | |||
|  | 		} else | |||
|  | 		{ | |||
|  | 			if(!isSilence) | |||
|  | 				Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG).show(); | |||
|  | 		} | |||
|  | 
 | |||
|  | 	} | |||
|  | 	  void processTxtOnSuccess(byte[] paramArrayOfByte) { | |||
|  | 	  | |||
|  | 		  	boolean isUpdate=false; | |||
|  | 			  int versionCode = getVersionCode(mContext);  | |||
|  | 			  InputStream inputStream = null;   | |||
|  | 			  inputStream =new ByteArrayInputStream(paramArrayOfByte); | |||
|  |  			  ParseXmlService service = new ParseXmlService(); | |||
|  | 				try | |||
|  | 				{ | |||
|  | 					  | |||
|  | 					if(inputStream!=null) | |||
|  | 						mHashMap = service.parseXml(inputStream); | |||
|  | 					 | |||
|  | 				} catch (Exception e) | |||
|  | 				{ | |||
|  | 					e.printStackTrace(); | |||
|  | 				} | |||
|  | 				if (null != mHashMap) | |||
|  | 				{ | |||
|  | 					int serviceCode = Integer.valueOf(mHashMap.get("version")); | |||
|  | 					// need update or not  | |||
|  | 					isUpdate =serviceCode > versionCode; | |||
|  | 				}	  | |||
|  | 				 | |||
|  | 				if (isUpdate) | |||
|  | 				{ | |||
|  | 					mHandler.sendEmptyMessage(showDialog); | |||
|  | 
 | |||
|  | 				} else | |||
|  | 				{ | |||
|  | 					if(!isSilence) | |||
|  | 						Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG).show(); | |||
|  | 				} | |||
|  | 			    | |||
|  | 		   | |||
|  | 	  } | |||
|  | 	 | |||
|  | 	 | |||
|  | 	  | |||
|  | 	 | |||
|  | 	/** | |||
|  | 	 * 閼惧嘲褰囨潪顖欐閻楀牊婀伴崣锟<E5B4A3>	 *  | |||
|  | 	 * @param context | |||
|  | 	 * @return | |||
|  | 	 */ | |||
|  | 	public   int getVersionCode(Context context) | |||
|  | 	{ | |||
|  | 
 | |||
|  | 		int versionCode = 0; | |||
|  | 		try | |||
|  | 		{ | |||
|  | 			// 閼惧嘲褰囨潪顖欐閻楀牊婀伴崣鍑ょ礉鐎电懓绨睞ndroidManifest.xml娑撳獘ndroid:versionCode | |||
|  | 			versionCode =(int)CommonUtil.getVersionCodeLong(context);// context.getPackageManager().getPackageInfo("com.novelbook.android", 0).versionCode; | |||
|  | 
 | |||
|  | 			/*int versionCode2 = CommonUtil.getVersionCode(context); | |||
|  | 			long versioncode3 = CommonUtil.getVersionCodeLong(context); | |||
|  | 
 | |||
|  | 			String versionname = CommonUtil.getVersion(context); | |||
|  | 			String v = CommonUtil.getVersionName(context); | |||
|  | 			String packnm =    context.getPackageName(); | |||
|  | 			String p ="A";*/ | |||
|  | 		} catch ( Exception e) | |||
|  | 		{ | |||
|  | 
 | |||
|  | 			Log.e(TAG, "getVersionCode: ",e); | |||
|  | 		} | |||
|  | 		return versionCode; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	/** | |||
|  | 	 * 閼惧嘲褰囨潪顖欐閻楀牊婀伴崣锟<E5B4A3>	 *  | |||
|  | 	 * @param context | |||
|  | 	 * @return | |||
|  | 	 */ | |||
|  | 	public static String getVersionName(Context context) | |||
|  | 	{ | |||
|  | 		String versionName = ""; | |||
|  | 		try | |||
|  | 		{ | |||
|  | 			// 閼惧嘲褰囨潪顖欐閻楀牊婀伴崣鍑ょ礉鐎电懓绨睞ndroidManifest.xml娑撳獘ndroid:versionCode | |||
|  | 			versionName = context.getPackageManager().getPackageInfo("com.qiyou.mb.android", 0).versionName; | |||
|  | 		} catch (NameNotFoundException e) | |||
|  | 		{ | |||
|  | 			Log.e(TAG, "getVersionCode: ",e); | |||
|  | 		} | |||
|  | 		return versionName; | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/** | |||
|  | 	 * 閺勫墽銇氭潪顖欐閺囧瓨鏌婄<E98F8C>纭呯樈濡楋拷 | |||
|  | 	 */ | |||
|  | 	private void showNoticeDialog() | |||
|  | 	{ | |||
|  | 		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||
|  | 			CommonUtil.checkPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE, EXTERNAL_STORAGE_REQ_CODE, "下载更新需要此权限,请允许"); | |||
|  | 			CommonUtil.checkPermission(mContext, Manifest.permission.INSTALL_PACKAGES, 1024, "下载更新需要此权限,请允许"); | |||
|  | 		} | |||
|  | 
 | |||
|  | 		// 閺嬪嫰锟界<E9949F>纭呯樈濡楋拷 | |||
|  | 	 	Builder builder = new Builder(mContext); | |||
|  | 
 | |||
|  | 	 	if(isForceRefresh) { | |||
|  | 			builder.setTitle(R.string.soft_force_update_title); | |||
|  | 		}else { | |||
|  | 			builder.setTitle(R.string.soft_update_title); | |||
|  | 		} | |||
|  | 		String upgradeDetails=mHashMap.get("details"); | |||
|  | 		String forceRefresh =isForceRefresh? "本地版本过低,请升级新版本":""; | |||
|  | 		builder.setMessage( forceRefresh +/*mContext.getPackageName() +*/ "\n当前版本:"+getVersionCode(mContext) +"\n" | |||
|  | 				+"最新版本:"+ serviceCode  +"\n" | |||
|  | 				+ mContext.getString(R.string.soft_update_info) +  upgradeDetails ); | |||
|  | 		builder.setPositiveButton(R.string.soft_update_updatebtn, new OnClickListener() | |||
|  | 		{ | |||
|  | 			@Override | |||
|  | 			public void onClick(DialogInterface dialog, int which) | |||
|  | 			{ | |||
|  | 				dialog.dismiss(); | |||
|  | 			    showDownloadDialog(); | |||
|  | 			} | |||
|  | 		}); | |||
|  | 		// 缁嬪秴鎮楅弴瀛樻煀 | |||
|  | 		builder.setNegativeButton(R.string.soft_update_later, new OnClickListener() | |||
|  | 		{ | |||
|  | 			@Override | |||
|  | 			public void onClick(DialogInterface dialog, int which) | |||
|  | 			{ | |||
|  | 				dialog.dismiss(); | |||
|  | 				if(isForceRefresh){ | |||
|  | 					exit(-1); | |||
|  | 				} | |||
|  | 			} | |||
|  | 		}); | |||
|  | 		Dialog noticeDialog = builder.create(); | |||
|  | 		noticeDialog.setCancelable(false); | |||
|  | 		noticeDialog.show(); | |||
|  | 
 | |||
|  | 
 | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/** | |||
|  | 	 * 閺勫墽銇氭潪顖欐娑撳娴囩<E5A8B4>纭呯樈濡楋拷 | |||
|  | 	 */ | |||
|  | 	private void showDownloadDialog() | |||
|  | 	{ | |||
|  | 		// 閺嬪嫰锟芥潪顖欐娑撳娴囩<E5A8B4>纭呯樈濡楋拷 | |||
|  | 		Builder builder = new Builder(mContext); | |||
|  | 		builder.setTitle(R.string.soft_updating); | |||
|  | 		// 缂佹瑤绗呮潪钘夘嚠鐠囨繃顢嬫晶鐐插鏉╂稑瀹抽弶锟<E5BCB6>		 | |||
|  | 		final LayoutInflater inflater = LayoutInflater.from(mContext); | |||
|  | 		View v = inflater.inflate(R.layout.softupgrade_progress, null); | |||
|  | 		mProgress = (ProgressBar) v.findViewById(R.id.update_progress); | |||
|  | 		builder.setView(v); | |||
|  | 		// 閸欐牗绉烽弴瀛樻煀 | |||
|  | 		builder.setNegativeButton(R.string.soft_update_cancel, new OnClickListener() | |||
|  | 		{ | |||
|  | 			@Override | |||
|  | 			public void onClick(DialogInterface dialog, int which) | |||
|  | 			{ | |||
|  | 				dialog.dismiss(); | |||
|  | 				// 鐠佸墽鐤嗛崣鏍ㄧХ閻樿埖锟<E59F96> | |||
|  | 				cancelUpdate = true; | |||
|  | 				if(isForceRefresh){ | |||
|  | 					exit(-1); | |||
|  | 				} | |||
|  | 			} | |||
|  | 		}); | |||
|  | 		mDownloadDialog = builder.create(); | |||
|  | 		mDownloadDialog.setCancelable(true); | |||
|  | 		mDownloadDialog.show(); | |||
|  | 		// 閻滄澘婀弬鍥︽ | |||
|  | 		downloadApk(); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/** | |||
|  | 	 * 娑撳娴嘺pk閺傚洣娆<E6B4A3> | |||
|  | 	 */ | |||
|  | 	private void downloadApk() | |||
|  | 	{ | |||
|  | 
 | |||
|  | 		// 閸氼垰濮╅弬鎵殠缁嬪绗呮潪鍊熻拫娴狅拷 | |||
|  | 		new downloadApkThread().start(); | |||
|  | 	} | |||
|  | 
 | |||
|  | 	/** | |||
|  | 	 * 娑撳娴囬弬鍥︽缁捐法鈻<E6B395> | |||
|  | 	 */ | |||
|  | 	private class downloadApkThread extends Thread | |||
|  | 	{ | |||
|  | 		@Override | |||
|  | 		public void run() | |||
|  | 		{ | |||
|  | 			try | |||
|  | 			{ | |||
|  | 				// 閸掋倖鏌嘢D閸椻剝妲搁崥锕<E5B4A5>摠閸︻煉绱濋獮鏈电瑬閺勵垰鎯侀崗閿嬫箒鐠囪鍟撻弶鍐 | |||
|  | 				if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) | |||
|  | 				{ | |||
|  | 					// 閼惧嘲绶辩<E7BBB6>妯哄亶閸楋紕娈戠捄顖氱窞 | |||
|  | 					String sdpath = Environment.getExternalStorageDirectory() + "/" +"GDTDOWNLOAD/"; | |||
|  | 					mSavePath = sdpath + "download"; | |||
|  | 					URL url = new URL(mHashMap.get("url")); | |||
|  | 					// 閸掓稑缂撴潻鐐村复 | |||
|  | 					HttpURLConnection conn = (HttpURLConnection) url.openConnection(); | |||
|  | 					conn.connect(); | |||
|  | 					// 閼惧嘲褰囬弬鍥︽婢堆冪毈 | |||
|  | 					int length = conn.getContentLength(); | |||
|  | 					// 閸掓稑缂撴潏鎾冲弳濞达拷 | |||
|  | 					InputStream is = conn.getInputStream(); | |||
|  | 
 | |||
|  | 					File file = new File(mSavePath); | |||
|  | 					// 閸掋倖鏌囬弬鍥︽閻╊喖缍嶉弰顖氭儊鐎涙ê婀<C3AA> | |||
|  | 					if (!file.exists()) | |||
|  | 					{ | |||
|  | 						file.mkdir(); | |||
|  | 					} | |||
|  | 					File apkFile = new File(mSavePath, mHashMap.get("name")); | |||
|  | 					FileOutputStream fos = new FileOutputStream(apkFile); | |||
|  | 					int count = 0; | |||
|  | 					// 缂傛挸鐡<E68CB8> | |||
|  | 					byte buf[] = new byte[1024]; | |||
|  | 					// 閸愭瑥鍙嗛崚鐗堟瀮娴犳湹鑵<E6B9B9> | |||
|  | 					do | |||
|  | 					{ | |||
|  | 						int numread = is.read(buf); | |||
|  | 						count += numread; | |||
|  | 						// 鐠侊紕鐣绘潻娑樺閺夆<E996BA>缍呯純锟<E7B494>						 | |||
|  | 						progress = (int) (((float) count / length) * 100); | |||
|  | 						// 閺囧瓨鏌婃潻娑樺 | |||
|  | 						mHandler.sendEmptyMessage(DOWNLOAD); | |||
|  | 						if (numread <= 0) | |||
|  | 						{ | |||
|  | 							// 娑撳娴囩<E5A8B4>灞惧灇 | |||
|  | 							mHandler.sendEmptyMessage(DOWNLOAD_FINISH); | |||
|  | 							break; | |||
|  | 						} | |||
|  | 						// 閸愭瑥鍙嗛弬鍥︽ | |||
|  | 						fos.write(buf, 0, numread); | |||
|  | 					} while (!cancelUpdate);// 閻愮懓鍤崣鏍ㄧХ鐏忓崬浠犲顤嶇瑓鏉烇拷 | |||
|  | 					fos.close(); | |||
|  | 					is.close(); | |||
|  | 				} | |||
|  | 			} catch (MalformedURLException e) | |||
|  | 			{ | |||
|  | 				if(isForceRefresh){ | |||
|  | 					exit(-1); | |||
|  | 				} | |||
|  | 				Log.e(TAG, "run: ", e); | |||
|  | 			} catch (IOException e) | |||
|  | 			{ | |||
|  | 			 	mContext.checkAndRequestPermission(); | |||
|  | 				if(isForceRefresh){ | |||
|  | 				//	exit(-1); | |||
|  | 				} | |||
|  | 				Log.e(TAG, "run: ", e); | |||
|  | 			} | |||
|  | 			// 閸欐牗绉锋稉瀣祰鐎电鐦藉鍡樻▔缁<E29694>拷 | |||
|  | 			mDownloadDialog.dismiss(); | |||
|  | 		} | |||
|  | 	}; | |||
|  | 
 | |||
|  | 	/** | |||
|  | 	 * 鐎瑰顥朅PK閺傚洣娆<E6B4A3> | |||
|  | 	 */ | |||
|  | 	private void installApk() | |||
|  | 	{ | |||
|  | 		File apkfile = new File(mSavePath, mHashMap.get("name")); | |||
|  | 		if (!apkfile.exists()) | |||
|  | 		{ | |||
|  | 			return; | |||
|  | 		} | |||
|  | 		// 闁俺绻僆ntent鐎瑰顥朅PK閺傚洣娆<E6B4A3> | |||
|  | 		Intent i = new Intent(Intent.ACTION_VIEW); | |||
|  | 		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { | |||
|  | 			i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive"); | |||
|  | 			i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||
|  | 		} else { | |||
|  | 			// 声明需要的临时权限 | |||
|  | 			// 第二个参数,即第一步中配置的authorities | |||
|  | 			Uri contentUri = FileProvider.getUriForFile(MyApp.applicationContext, BuildConfig.APPLICATION_ID + ".fileprovider", apkfile); | |||
|  | 			i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | |||
|  | 			i.setDataAndType(contentUri, "application/vnd.android.package-archive"); | |||
|  | 		} | |||
|  | 
 | |||
|  | 
 | |||
|  | 		mContext.startActivity(i); | |||
|  | 		exit(-1); | |||
|  | 	} | |||
|  | } |