Android Question Install new apk version from the apk itself.

vecino

Well-Known Member
Licensed User
Longtime User
Hello, from my apk I download a new version and I run the new apk to install it.
I always get the error: "Application not installed"
Is it possible to install an apk from an apk?
Taking into account that it is the same apk, although a different version.
They have the same name and are running.
I have tried the code of several similar threads, although I do not know if those examples are designed to run another different apk or, what I want to do, is the same apk.
 

vecino

Well-Known Member
Licensed User
Longtime User
Sorry, but I'm a bit confused now.
You have a device for which the code doesn't work, right?
And a second device that executes the updated code on program start instead of after pressing the "1" button, right?
Yes, yes.

I have checked the Shared directory and it is empty.
I have many doubts about the use of AppUpdate. Can I use the class instead of the library?

Is it possible to execute the update only, only, when the user presses a button?
I would like to do it that way: The user presses a button (when he wants) and then it checks if there is a new version, it is downloaded and updated.
Just that. But at the moment I have not managed to do it with any device. I do not know the motive

ps: let me know if you'd like me to prepare a special version of the lib full of logs in order to better undesrtand the probolem about device #1 or whether you prefer to do it yourself.
I do not want to bother you, I'm stealing you a lot of time. Do it only if you can really dedicate a time that you do not mind dedicating to help me.
Many thanks.
 
Upvote 0

udg

Expert
Licensed User
Longtime User
I have checked the Shared directory and it is empty.
I have many doubts about the use of AppUpdate. Can I use the class instead of the library?

That Shared is empty is a bit strange. Worth investigating.
About the use of the class, absolutely yes. The library is there just to have a "container" for the class and the service. You are free to use all the code the way you mostly like (and, obviously, free to amend, modify and personalize it). if you choose to go with the class, please don't forget to add the newinst2 service too (yes, you can name it differently but then you have to modify the Manifes accordingly)

Is it possible to execute the update only, only, when the user presses a button?
Yes. There's no need to check at app start. All the methods of the class are designed to work "on request". Whether you call one after the other (read current version, read webversion, compare, download, install) or the "do it all" one, you can place your call in a button click. As said, I've used your exact code and it worked for me.

I do not want to bother you, I'm stealing you a lot of time. Do it only if you can really dedicate a time that you do not mind dedicating to help me.
It will be a 10 minutes operation. I plan to do it at lunch time. I am curious to read the resulting logs.
 
Upvote 0

udg

Expert
Licensed User
Longtime User
Hi, please find attached :
- source code of the lib with a few extra logs here and there
- source code for your viamos project, sligthly modified in order to acquire more info.
The spoiler below shows my log window running the modified versions of viamos+lib
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
SDK#: 19 - UseFP: false - SharedFolder: /storage/emulated/0/Android/data/viamos.com/files/shared
check 4
---- AppUpdating.UpdateApk
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
Webserver's info file content:
ver=2
Web version number: 2
Current Version: 1
Newer version available. Now I try its downloading
-- TryApkUpdate
Donload ok? true
Copy2 (saving) ok? TRUE
new apk version downloaded and ready to install
user asked to install new apk
UpdateComplete - time: 12:03:24
** Activity (main) Pause, UserClosed = false **
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = true **

Please run the code as published in this post and return abck your log's window content. Thank you.
 

Attachments

  • AU202_src.zip
    15.1 KB · Views: 238
  • viamos.zip
    30 KB · Views: 244
Upvote 0

vecino

Well-Known Member
Licensed User
Longtime User
Hello, friend, and many thanks for your help.
The program "viamos" edited by you, works well in one of the devices.
In the other, it always shows the error -8

However, I tried to compile it in debug mode and, it works fine !!!
But in release mode the error message -8 is always output as usual.

I copy the log:
 
Last edited:
Upvote 0

udg

Expert
Licensed User
Longtime User
Did you compile it with version 2.02 of the lib? I can't see the extra logs I added there, specifically the one about SDK, FP and SharedFolder (line 69 in class Initialize).
Reading "check 4" after Main Resume tells me that any installation requirement is fullfilled, so the problem should be confined to the temp directory (as we suspect from the beginning).
 
Upvote 0

vecino

Well-Known Member
Licensed User
Longtime User
Hi, I do not know what I should type to replace this: eu.dgconsulting.appupdating.newinst2

B4X:
AddReceiverText(eu.dgconsulting.appupdating.newinst2,
  <intent-filter>
  <action android:name="android.intent.action.PACKAGE_REPLACED" />
    <data android:scheme="package" />
  </intent-filter>)
 
Upvote 0

udg

Expert
Licensed User
Longtime User
It depends on how you should reach the service code.
If you build a new library named ApkVecino whose package name is com.viamos.apkvecino AND rename the service to be myinst123 then the snippet in the Manifest will be:
B4X:
AddReceiverText(com.vecino.apkvecino.myinst123,
  <intent-filter>
  <action android:name="android.intent.action.PACKAGE_REPLACED" />
    <data android:scheme="package" />
  </intent-filter>)

Alternatively, if you directly add class and service code to your program (the app that gets updated) than the snippet will look like:
B4X:
AddReceiverText(com.vecino.myinst123,
  <intent-filter>
  <action android:name="android.intent.action.PACKAGE_REPLACED" />
    <data android:scheme="package" />
  </intent-filter>)

My suggestion is to dedicate some more time to solve the problem with your first device before coding a personalized solution based on my code.
 
Upvote 0

vecino

Well-Known Member
Licensed User
Longtime User
Hello again
I've done a test normally, in release mode.
Show the error -8

Then I made another test, in debug mode. It has worked.

Attached the complete log of the 2 tests.
I hope that information will serve you.
Regards.

Logger connected to: unknown miTab LIVE
--------- beginning of /dev/log/main
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
SDK#: 19 - UseFP: false - SharedFolder: /mnt/sdcard/Android/data/viamos.com/files/shared
check 4
---- AppUpdating.UpdateApk
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
Webserver's info file content:
ver=2
Web version number: 2
Current Version: 1
Newer version available. Now I try its downloading
-- TryApkUpdate
Donload ok? true
Copy2 (saving) ok? FALSE
failed download of new apk version
UpdateComplete - time: 10:58:15
** Activity (main) Pause, UserClosed = true **
Logger connected to: unknown miTab LIVE
--------- beginning of /dev/log/main
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
SDK#: 19 - UseFP: false - SharedFolder: /mnt/sdcard/Android/data/viamos.com/files/shared
check 4
---- AppUpdating.UpdateApk
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
Webserver's info file content:
ver=2
Web version number: 2
Current Version: 1
Newer version available. Now I try its downloading
-- TryApkUpdate
Donload ok? true
Copy2 (saving) ok? FALSE
failed download of new apk version
UpdateComplete - time: 10:58:15
** Activity (main) Pause, UserClosed = true **
Copying updated assets files (2)
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
SDK#: 19 - UseFP: false - SharedFolder: /mnt/sdcard/Android/data/viamos.com/files/shared
check 4
---- AppUpdating.UpdateApk
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
Webserver's info file content:
ver=2
Web version number: 2
Current Version: 1
Newer version available. Now I try its downloading
-- TryApkUpdate
Donload ok? true
Copy2 (saving) ok? TRUE
new apk version downloaded and ready to install
user asked to install new apk
UpdateComplete - time: 11:00:34
** Activity (main) Pause, UserClosed = false **
 
Upvote 0

udg

Expert
Licensed User
Longtime User
Very informative, indeed.
Test #1 fails at the OpenOutput or Copy2 step (opening or writing the buffer containing the correctly downloaded new apk). That was the "catch" playing its role.
Test #2 works although anything stay unchanged, the only difference being the former was conducted as Release the latter as Debug.

Can you place a log statement right below the OpenOutput line (261 in cl_appupdate) and soon above the Copy2 instruction? Then run again the Release mode test.
What I'd like to understand is whether OpenOutput fails (that's what I expect) or it passes ok and then Copy2 fails. If the latter, maybe a short delay between the two could cure the problem (based on the assumption that the debugger let the code run slower, so we introduce an "artificial" delay).

SharedFolder: /mnt/sdcard/Android/data/viamos.com/files/shared looks correct as a virtual secondary storage in a 4.4 device. It is what GetSafeDirDefaultExternal returns, anyway.
 
Upvote 0

vecino

Well-Known Member
Licensed User
Longtime User
Hello, the error occurs on the line:
out = File.OpenOutput (SharedFolder, "tmp.apk", False)
From there, jump to the catch.
I have removed the "try catch" and I attached a screen copy so you can see everything.



 
Upvote 0

vecino

Well-Known Member
Licensed User
Longtime User
Hello, finally it worked well
The change has been to replace File.DirInternal with File.DirDefaultExternal
Although the result is the same directory in both cases
B4X:
UseFileProvider = True
'' 'SharedFolder = File.Combine (File.DirInternal, "shared")
SharedFolder = File.Combine (File.DirDefaultExternal, "shared")

Log ("--- >>>>>> SharedFolder:" & SharedFolder)

File.MakeDir ("", SharedFolder)
I do not understand much about these matters, but it seems very strange to me.

THANK YOU VERY MUCH for your help.



 
Upvote 0

vecino

Well-Known Member
Licensed User
Longtime User
Oh, I just checked that the code does not pass through there, but through the "else".
Why does it work now? I have not made any more changes
However, it works well.
 
Upvote 0

vecino

Well-Known Member
Licensed User
Longtime User
If I do not see it, I do not believe it.
Finally, I have found the problem, and it is impossible to believe.
I have done many tests and the result is always the same.

With DirInternal it does not work.
With DirDefaultExternal it works.

It's incredible, because the code does not pass through there, but rather through the else:
Does anyone have a reasonable explanation?
B4X:
If p.SdkVersion >= 24 Or File.ExternalWritable = False Then
        UseFileProvider = True
        '''SharedFolder = File.Combine(File.DirInternal, "shared")
        SharedFolder = File.Combine(File.DirDefaultExternal, "shared")
        
        Log("(1)--->>>>>> SharedFolder: "&SharedFolder)
        
        File.MakeDir("", SharedFolder)
    Else
        UseFileProvider = False
        SharedFolder = rp.GetSafeDirDefaultExternal("shared")

 
Upvote 0

udg

Expert
Licensed User
Longtime User
Thank you very much.
There's a Permission denied error on the path returned by GetSafeDirDefaultExternal. This shouldn't happen. And you have evidence that using the exact same code in debug mode (which return the same path) everything works.
The DirInternal/DirDefaultExternal case is even more incredible. Time to open a specific thread to drive Erel's attention on that point alone.
 
Upvote 0

vecino

Well-Known Member
Licensed User
Longtime User
Thank you very much for your help.
Without your patience it would have been impossible for me.
Thanks again.
 
Upvote 0
Cookies are required to use this site. You must accept them to continue using the site. Learn more…