View Full Version : مشکل در Replace و نصب بعد از آپگرید برنامه
meysam jahedi
شنبه 25 بهمن 1393, 21:27 عصر
سلام
وقتی برنامه اجرا میشه چک میکنه از سرور که آیا آپدیت اومده یا نه ، وقتی آپدیت جدید اومده باشه اون رو دانلود میکنه و بعد با خط زیر نصب میکنه برنامه جدید رو :
Intent intent = new Intent (Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile
(new File(Environment.getExternalStorageDirectory() + "/download/" + AppName)
), "application/vnd.android.package-archive");
startActivity(intent);
حالا مشکل اینجاست که پس از دانلود نسخه جدید ، موقع نصب و replace ، خطای زیر رو میده :
Application not installed
An existing package the same name with a conflicting signature is already installed
نمیدونم چکارش کنم
چندجایی حرف از key های متفاوت زده شده ، منظور از key ها چیه ؟
meysam jahedi
شنبه 25 بهمن 1393, 22:31 عصر
دوستان کسی نظری نداره؟
gilas1368
یک شنبه 26 بهمن 1393, 08:21 صبح
من همین مکانیزم شما رو پیاده سازی کردم
اما برای نصب خودم عمل نمیکنم و کدی ننوشتم
بعد از نصب خوده کاربر روی فایل دانلودی کلیک میکنه و بقیه کارا رو خوده هسته اندروید انجام میده
بنظر من این بهتره ک خوده هسته بیاد و کارا رو انجام بده تا شما براش کد بنویسید تا اجرا بشه
شاید اصن کاربر نخاد اون ورژن رو نصب کنه و صرفا میخاد دانش کنه و بدش ب یکی دیگ
meysam jahedi
یک شنبه 26 بهمن 1393, 10:27 صبح
من همین مکانیزم شما رو پیاده سازی کردم
اما برای نصب خودم عمل نمیکنم و کدی ننوشتم
بعد از نصب خوده کاربر روی فایل دانلودی کلیک میکنه و بقیه کارا رو خوده هسته اندروید انجام میده
بنظر من این بهتره ک خوده هسته بیاد و کارا رو انجام بده تا شما براش کد بنویسید تا اجرا بشه
شاید اصن کاربر نخاد اون ورژن رو نصب کنه و صرفا میخاد دانش کنه و بدش ب یکی دیگ
یعنی میفرمایید با یه پیام به کاربر فقط اتمام دانلود رو نشون بدم؟
gilas1368
یک شنبه 26 بهمن 1393, 10:53 صبح
اصن نیاز ب چیزی نداره
چون برنامه ک شروع ب دان میشه توی نوتیفکیشن بار ی نوتیف اضافه میشه و روند دانلود رو نمایش میده
دانلود هم ک تمام بشه اون آیکونش میمونه تا زمانیک کاربر خودش یا نوتیف رو پاک کنه یا روش ضربه بزنه
meysam jahedi
یک شنبه 26 بهمن 1393, 11:19 صبح
یه چیزی که سر در نمیارم اینه که
وقتی نسخه جدید رو با یه تغییر مثلا اضافه کردن یه دکمه میسازم و خروجی رو از تویه فولدرهای ایکلیپس کپی میکنم و میزارم تو هاست ، و بعدش که توی امیلاتور نسخه قبلی رو از ایکلیپس اجرا میگیرم برنامه به درستی کار میکنه و replace هم میشه ،
اما وقتی نسخه جدید رو از طریق Export میسازم و تو هاست میزارمش ، وقتی دانلود میشه موقع نصب خطا میده که از قبل وجود داره .
1- چه فرقی بین اون .apk ای که از تو فولدرهای workspace گرفتمش با .apk ای که از export ساختم وجود داره ؟
2- یعنی به جای export میتونیم .apk ساخته شده توسط ایکلیپس موقع build رو از تو فولدر ها کپی کنیم و برداریم و با اطمینان به عنوان خروجی بگیریمش؟
gilas1368
یک شنبه 26 بهمن 1393, 11:32 صبح
من با ایکلیپس کار نمیکنم و ب شمام پیشنهاد میکنم ب سمت اندروید استدیو برید
دلیل این مشکل رو هم ب طبع بدلیل عدم شناخت ساختار خروجی های ایکلیپس نمیدونم
اما خودم توی اندروید استدیو همیشه فایلی رو ک برنامه برام build میکنه و میسازه رو برای دان و اجرا میزارم
meysam jahedi
یک شنبه 26 بهمن 1393, 18:58 عصر
متأسفانه این مشکلم هنوز حل نشده
نمیدونم چرا از تو فولدرهای ایکلیپس و workspace وقتی .apk ای که ساخته شده رو میزارم مشکلی پیش نمیاد و نسخه جدید بعد از دانلود نصب و replace میشه اما وقتی از طریق Export خروجی میگیرم برای نسخه جدید و قدیم برنامه (دقیقا با یک keyهای یکسان) ، موقع نصب و replace خطا میده و میگه از قبل هستش .
دوستان خروجی گرفتن از طریق export فرقش با اون فایل .apk ای که تو workspace مون هستش چیه؟ آیا باید حتما با export خروجی بگیریم ؟ نمیشه از همون .apk موجود تو فولدر bin استفاده کرد ؟
esideli
یک شنبه 26 بهمن 1393, 19:58 عصر
شما هر دو تا برنامه رو با یک keystore خروجی می گیرین؟ اگه این کار رو نکنی امضای برنامه توی هر نسخه تغییر می کنه. وقتی که یه خروجی apk می گیری یه فایل بدون پسوند کنارش ساخته می شه. برای خروجی گرفتن apk جدید باید هنگام خروجی گرفتن و زمانی که اولین پسورد رو ازتون می خواد آدرس اون فایل بدون پسوند رو بدید و keystore جدید درست نکنین تا امضای برنامه عوض نشه.
Mehrnaz_k
یک شنبه 26 بهمن 1393, 20:56 عصر
versionCode رو تغییر میدید؟
meysam jahedi
یک شنبه 26 بهمن 1393, 23:00 عصر
شما هر دو تا برنامه رو با یک keystore خروجی می گیرین؟ اگه این کار رو نکنی امضای برنامه توی هر نسخه تغییر می کنه. وقتی که یه خروجی apk می گیری یه فایل بدون پسوند کنارش ساخته می شه. برای خروجی گرفتن apk جدید باید هنگام خروجی گرفتن و زمانی که اولین پسورد رو ازتون می خواد آدرس اون فایل بدون پسوند رو بدید و keystore جدید درست نکنین تا امضای برنامه عوض نشه.
شما هر دو تا برنامه رو با یک keystore خروجی می گیرین؟
متوجه نمیشم منظورتون رو ، خب برای هر دو برنامه پسورد ،.. مشترک میزنم موقع خروجی گرفتن .
آدرس اون فایل بدون پسوند رو بدید و keystore جدید درست نکنین
خب آدرس اون فایل بدون پسوند رو بدم که خطا میگیره که از قبل هستش!!
versionCode رو تغییر میدید؟
نه تغییر نمیدم.
esideli
یک شنبه 26 بهمن 1393, 23:57 عصر
متوجه نمیشم منظورتون رو ، خب برای هر دو برنامه پسورد ،.. مشترک میزنم موقع خروجی گرفتن .
خب آدرس اون فایل بدون پسوند رو بدم که خطا میگیره که از قبل هستش!!
اگه هر بار که خروجی می گیرین یه keystore جدید بسازین ولو اینکه پسورد ها هم یکی باشه، امضای برنامه تغییر می کنه. شما اون فایل بدون پسوند رو بزار تو دسکتاپ و تو مرحله زیر اون رو اضافه کن و از دو گزینه بالا، گزینه اول انتخاب شده باشه. بار اول که خروجی گرفتی اون فایل بدون پسوند رو برای آپدیت های بعدی نگه دار. راستی برای هر آپدیت باید versionCode رو افزایش بدی بصورت یک عدد صحیح.
128516
meysam jahedi
دوشنبه 27 بهمن 1393, 10:35 صبح
راستی برای هر آپدیت باید versionCode رو افزایش بدی بصورت یک عدد صحیح.
ممنون از توجهتون
من یه txt تو هاست گذاشتم که یه عدد مثلا 2.0 توش گذاشتم ، که برنامه یه string رو باهاش چک میکنه و اگه متفاوت باشه میفهمه که برنامه بروز نیست .
حالا نمیدونم چه لزومی هست Version code رو تو پروژه تغییر بدم ؟
esideli
دوشنبه 27 بهمن 1393, 11:53 صبح
ممنون از توجهتون
من یه txt تو هاست گذاشتم که یه عدد مثلا 2.0 توش گذاشتم ، که برنامه یه string رو باهاش چک میکنه و اگه متفاوت باشه میفهمه که برنامه بروز نیست .
حالا نمیدونم چه لزومی هست Version code رو تو پروژه تغییر بدم ؟
شما اگه بخوای نسخه جدید برنامت رو توی مارکت آندروید بزاری باید ورژن کد رو افزایش بدی تا سیستم متوجه نسخه جدید بشه.
meysam jahedi
دوشنبه 27 بهمن 1393, 12:46 عصر
شما اگه بخوای نسخه جدید برنامت رو توی مارکت آندروید بزاری باید ورژن کد رو افزایش بدی تا سیستم متوجه نسخه جدید بشه.
راستش تا حالا برنامه جایی نزاشتم ، مارکت منظورتون مثل کافه بازار و..؟ منظورتون از سیستم چیه ؟ یعنی مثلا بازار چک میکنه که ورژن تغییر کرده یا نه؟
esideli
دوشنبه 27 بهمن 1393, 13:15 عصر
شما این دو کار رو که گفتم انجام دادی؟
meysam jahedi
دوشنبه 27 بهمن 1393, 15:04 عصر
با روشی که گفتید با امضا قبلی خروجی بگیرم ، بله انجام دادم و به لطف شما مشکلم حلش و برنامه نسخه جدید رو دانلود میکنه و Replace هم میکنه .:قلب:
ولی Version Code رو تغییر ندادم ، فقط به یه string شرطی " چک میکنم که برنامه به روز هست یا نه .
در کل مشکلم حل شد ، ولی اینکه فرمودید version code رو تغییر بدید برای مارکت ها ... متوجه نمیشم چرا
pesare
دوشنبه 27 بهمن 1393, 17:40 عصر
با روشی که گفتید با امضا قبلی خروجی بگیرم ، بله انجام دادم و به لطف شما مشکلم حلش و برنامه نسخه جدید رو دانلود میکنه و Replace هم میکنه .:قلب:
ولی Version Code رو تغییر ندادم ، فقط به یه string شرطی " چک میکنم که برنامه به روز هست یا نه .
در کل مشکلم حل شد ، ولی اینکه فرمودید version code رو تغییر بدید برای مارکت ها ... متوجه نمیشم چرا
دوست عزیز اگر امکان داره کدهایی که کار کرد رو اینجا قرار بدید که من هم استفاده کنم , منم این مشکل رو دارم و برنامه دانلود میشه اما بعضی وفتا حجم برنامه و مشخضات رو نشون نمیده و خطای میده نمیتونه نصب کنه برنامه رو .
meysam jahedi
دوشنبه 27 بهمن 1393, 23:12 عصر
دوست عزیز اگر امکان داره کدهایی که کار کرد رو اینجا قرار بدید که من هم استفاده کنم , منم این مشکل رو دارم و برنامه دانلود میشه اما بعضی وفتا حجم برنامه و مشخضات رو نشون نمیده و خطای میده نمیتونه نصب کنه برنامه رو .
بفرمایید :
private class checkver extends AsyncTask<String,Void, String>
{
private ProgressDialog Dialog;
@Override
protected void onPreExecute(){
super.onPreExecute();
Dialog =new ProgressDialog(Main.this);
Dialog.setMessage("در حال ارتباط با سرور");
Dialog.show();
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
try {
String Url=params[0];
HttpClient httpClient=new DefaultHttpClient();
HttpContext localHttpContext=new BasicHttpContext();
HttpGet httpGet=new HttpGet(Url);
HttpResponse httpResponse = httpClient.execute(httpGet, localHttpContext);
BufferedReader reader=new BufferedReader
(new InputStreamReader(httpResponse.getEntity().getCont ent()));
char line[];
line=reader.readLine().toCharArray();
String a=new StringBuilder().append(line[0]).append(line[1]).append(line[2]).toString();
if (version.equals(a)) {
permision=false;
}else{
permision=true;
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
Dialog.dismiss();
if (permision==true) {
// Toast.makeText(Main.this, "برنامه به روز نیست",Toast.LENGTH_SHORT).show();
new updateApp().execute(file_url);
}else {
Toast.makeText(Main.this, "برنامه به روز می باشد",Toast.LENGTH_SHORT).show();
}
}
}
private class updateApp extends AsyncTask<String, String, Void >
{
@Override
protected void onPreExecute(){
showDialog(0);
}
@Override
protected Void doInBackground(String... params) {
try {
URL url = new URL(params[0]);
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.connect();
String PATH = "/mnt/sdcard/download/";
File file = new File(PATH);
file.mkdir();
String AppName = getString(R.string.app_name) + ".apk";
File outputFile = new File(file,AppName);
if (outputFile.exists())
outputFile.delete();
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is = c.getInputStream();
int lenght = c.getContentLength();
byte[] buffer = new byte[1024];
int len = 0;
int total = 0;
while ((len = is.read(buffer)) != -1)
{
total += len;
fos.write(buffer,0,len);
publishProgress("" + (total * 100) / lenght);
}
fos.flush();
fos.close();
is.close();
Intent intent = new Intent (Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile
(new File(Environment.getExternalStorageDirectory() + "/download/" + AppName)
), "application/vnd.android.package-archive");
startActivity(intent);
}
catch (MalformedURLException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
prg_dialog.setProgress(Integer.parseInt(values[0]));
}
protected void onPostExecute(String result){
dismissDialog(0);
}
}
@Override
protected Dialog onCreateDialog(int id){
prg_dialog=new ProgressDialog(this);
prg_dialog.setMessage("در حال به روز رسانی نرم افزار \n لطفا کمی صبر کنید");
prg_dialog.setMax(100);
prg_dialog.setProgressStyle(ProgressDialog.STYLE_H ORIZONTAL);
prg_dialog.show();
return prg_dialog;
}
esideli
سه شنبه 28 بهمن 1393, 00:48 صبح
با روشی که گفتید با امضا قبلی خروجی بگیرم ، بله انجام دادم و به لطف شما مشکلم حلش و برنامه نسخه جدید رو دانلود میکنه و Replace هم میکنه .:قلب:
ولی Version Code رو تغییر ندادم ، فقط به یه string شرطی " چک میکنم که برنامه به روز هست یا نه .
در کل مشکلم حل شد ، ولی اینکه فرمودید version code رو تغییر بدید برای مارکت ها ... متوجه نمیشم چرا
شما اگه بخوای یه نسخه جدید از برنامت رو توی یه مارکت آندروید که قبلا هم نسخه قدیمی برنامه رو براش فرستادی، بفرستی باید ورژن کد رو افزایش بدی تا سیستم اون مارکت تشخیص بده که شما نسخه جدیدی رو ارسال کردین.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.