рдЕрдкрдиреЗ Android рдмрд╛рдЬрд╛рд░ рд▓реЗрдЦрди

рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ (рд╢рддрд░рдВрдЬ рдФрд░ рдХрд╡рд┐рдпреЛрдВ) рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдорд╛рд░реНрдХреЗрдЯ рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереАред
рдЖрдкрдХреЗ рдмрд╛рдЬрд╛рд░ рдХреЛ рджреЛ рд╕рд░рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЙрдкрд▓рдмреНрдз рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдХреА рд╕реВрдЪреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛, рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ / рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдЧрд╛ред

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рд░реНрд╡рд░ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╛ рддреЛ рд╡рд┐рд╕реНрддреГрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрдВрдЬреАрдХрд░рдг, рд░рд┐рдкреЛрд░реНрдЯ, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг) рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд╡рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ:
<MyMarket> <application name="TestApp1" package="com.example.testapp1" versionCode="1" versionName="1.0" url="http://mobile...../android/download/TestApp1.apk"/> ..... </MyMarket> 

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд░реНрд╡рд░ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ http рдмреЙрд▓ рд╣реИред
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдпрд╣ xml рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред

рд╕реНрдерд╛рдкрдирд╛


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЙрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╣ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ
рдмрд╛рдЬрд╛рд░ рдпреВрдПрд╕рдмреА рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рдореЗрдВ рдПрдкреАрдХреЗ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд╛рдкрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддреГрддреАрдп-рдкрдХреНрд╖ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪреБрдкрдЪрд╛рдк рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж:
  URL url = new URL(apkurl); HttpURLConnection c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); File file = this.getExternalFilesDir("download"); File outputFile = new File(file, "app.apk"); 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.close(); is.close(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-archive"); startActivity(intent); 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдорд╛рдирдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
рдЫрд╡рд┐

рдЕрджреНрдпрддрди


рдмрд╛рдЬрд╝рд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╕реНрдерд╛рдкрд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЙрдкрд▓рдмреНрдз рд╣реИ:
  private boolean checkNewVersion(String packageName, int versionCodeNew) { List<ApplicationInfo> apps = getPackageManager() .getInstalledApplications(0); for (int i = 0; i < apps.size(); i++) { ApplicationInfo app = apps.get(i); if (packageName.equals(app.packageName)) { PackageManager manager = getPackageManager(); PackageInfo info; try { info = manager.getPackageInfo(app.packageName, 0); int versionCode = info.versionCode; if (versionCodeNew > versionCode) { Toast.makeText(this, "New Version!", Toast.LENGTH_LONG) .show(); return true; } } catch (NameNotFoundException e) { e.printStackTrace(); } } } return false; } 

рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдПрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рд╖реНрдХрд╛рд╕рди


рд╣рдорд╛рд░реЗ рдмрд╛рдЬрд╛рд░ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреЗ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдмреАрдЪ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рди рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдб рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
  Uri packageURI = Uri.parse("package:"+packageName); Intent intent = new Intent(Intent.ACTION_DELETE, packageURI); startActivity(intent); 

рдЫрд╡рд┐

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛


рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде, рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ, рд╣рдо рдмрд╛рдЬрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдмрд╛рдЬрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдирд┐рдореНрди рд╡рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВ
 public class CustomExceptionHandler implements UncaughtExceptionHandler { private File logsFolder = null; public static final String ERROR_INTENT = "com.example.markettestapp1.SEND_ERROR"; public CustomExceptionHandler(File logsFolder) { this.logsFolder = logsFolder; } @Override public void uncaughtException(Thread thread, Throwable ex) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); ex.printStackTrace(printWriter); String stacktrace = result.toString(); printWriter.close(); try { if (!logsFolder.exists()) { logsFolder.createNewFile(); } BufferedWriter writer = new BufferedWriter(new FileWriter(logsFolder, true)); writer.write(""+new Date()+"\n"+stacktrace); writer.close(); } catch (IOException e) { e.printStackTrace(); } Intent intent = new Intent(); intent.setAction(ERROR_INTENT); intent.putExtra("packageName", Test1Application.getApplication().getPackageName()); intent.putExtra("stacktrace", stacktrace); Test1Application.getInstanceApplication().sendBroadcast(intent); android.os.Process.killProcess(android.os.Process.myPid()); } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (рдЕрдкрд╡рд╛рдж), рдПрдХ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╕рд╛рд░рдг рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рднреЗрдЬрддрд╛ рд╣реИред

рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рднреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ
 public class Test1Application extends Application { @Override public void onCreate() { super.onCreate(); application = this; Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(new File(this.getApplicationContext().getExternalFilesDir(null),"exceptions.log"))); } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдореГрддреНрдпреБ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕рдВрджреЗрд╢ рд▓реЙрдЧ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рд╕рд╛рд░рдг рд╕рдВрджреЗрд╢ рдмрд╛рдЬрд╛рд░ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ,
рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХреЛрдб рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЯрд┐рдкреНрдкрдгреА)ред

рдорд╛рд░реНрдХреЗрдЯ рдореЗрдВ рд╣реА, рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ:
 public class SendErrorReceiver extends BroadcastReceiver { public static final String ERROR_INTENT = "com.example.markettestapp1.SEND_ERROR"; @Override public void onReceive(Context context, Intent intent) { Intent i = new Intent(context, SendErrorActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtra("stacktrace", intent.getStringExtra("stacktrace")); i.putExtra("packageName", intent.getStringExtra("packageName")); context.startActivity(i); } } 

AndroidManifest.xml:
  <receiver android:name="com.example.markettestapp1.SendErrorReceiver" android:enabled="true" > <intent-filter> <action android:name="com.example.markettestapp1.SEND_ERROR" > </action> </intent-filter> </receiver> 


рдФрд░ рдлрд┐рд░ рдмрд╛рдЬрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдореЗрд▓ рдкрд░ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡реЗрдм рд╕реЗрд╡рд╛ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддрд╛ рд╣реИред
рдЫрд╡рд┐

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХрдИ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдмреАрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдХреЗрдВрджреНрд░реАрдХреГрдд рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмрд╛рдЗрдХ рдХреИрд╕реЗ рд▓рд┐рдЦрдиреА рд╣реИред

рдкреАрдПрд╕: рдЖрд▓реЗрдЦ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛрдб рд╕реЗ рд▓рд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In163397/


All Articles