Use the paid-for app unlocks the free-app approach then you don't need
to share the database.  In the free just test for the presence of your
paid-for unlock app.  If you find it run with full functionality, if
you don't then run just with the restricted functionality of the free-
app.

This make upgrading from free to paid very simple and also gives you
less code to maintain. Have a read of threads:
http://groups.google.com/group/android-developers/browse_thread/thread/ba56064a2e6b33f4
http://groups.google.com/group/android-beginners/browse_thread/thread/7d5698ab66aadd62

--
RichardC

On Oct 27, 7:26 am, skyhigh <[email protected]> wrote:
> I am to the point in developing my paid application version where I
> need to implement the support for copying the database.
>
> I found that using CONTEXT_IGNORE_SECURITY gets me past the call to
> createPackageContext without a SecurityException, but it does not
> allow me to access the database files from my free version.  I have
> given both my free and paid applications the same shared user id
> string, but when I use CONTEXT_INCLUDE_CODE I am still getting a
> SecurityException when I call createPackageContext.
>
> In my manifest file for both the free and paid versions of my
> application I have set:
>    android:sharedUserId="@string/shared_user_id"
> and in the strings.xml file I have set:
>    <string name="shared_user_id">myappname</string>
>
> However when I call createPackageContext with the parameter
> CONTEXT_INCLUDE_CODE it generates the SecurityException:
>    Requesting code from com.mydomain.myappnamefree (with uid 10033) to
> be run in process com.mydomain.myappnamepaid (with uid 10049)
>
> Since the SecurityException is showing two different uid's it seems
> that setting the sharedUserId in the manifest file didn't actually
> result in both apps getting the same user id.
>
> The code I am trying to use to copy the database, from my free app,
> when my paid app starts up is:
>
>         public static void readPreviousPackageDb(Context myContext)
>         {
>                 File myDbFile = myContext.getDatabasePath(DATABASE_NAME);
>                 if (myDbFile.exists()) {
>                         // Paid app database already exists
>                         return;
>                 }
>
>                 Context freeContext = null;
>                 try {
>                         freeContext = myContext.createPackageContext(
>                                         FREE_VERSION_PACKAGE_NAME, 
> Context.CONTEXT_INCLUDE_CODE);
>                         if (freeContext == null) {
>                                 // Free version is not installed
>                                 return;
>                         }
>                 } catch (Exception e) {
>                         String error = e.getMessage();
>                         Log.e(TAG, "Could not copy previous edition database 
> " +
>                                         error);
>                         return;
>                 }
>                 File freeDbFile = freeContext.getDatabasePath(DATABASE_NAME);
>                 if (!freeDbFile.exists()) {
>                         Log.e(TAG, "Free database file is missing");
>                         return;
>                 }
>                 long freeDbSize = freeDbFile.length();
>                 Log.v(TAG, "File size is " + freeDbSize + " for file " +
> freeDbFile.getAbsolutePath());
>                 try {
>                         //FileInputStream inputStream = new 
> FileInputStream(freeDbFile);
>                         InputStream inputStream = freeContext.getAssets().open
> (freeDbFile.getAbsolutePath());
>                         myDbFile.createNewFile();
>                         FileOutputStream outputStream = new 
> FileOutputStream(myDbFile);
>                         byte buffer[] = new byte[2048];
>                         long copySize = 0;
>                         do {
>                                 int bytesRead = inputStream.read(buffer);
>                                 if (bytesRead <= 0) {
>                                         break;
>                                 }
>                                 outputStream.write(buffer, 0, bytesRead);
>                                 copySize += bytesRead;
>                         } while (true);
>                         Log.i(TAG, "Copied " + copySize + " of " + 
> freeDbSize);
>                         inputStream.close();
>                         outputStream.close();
>                 } catch (FileNotFoundException e) {
>                         String error = e.getMessage();
>                         Log.e(TAG, "Can't copy database from previous edition 
> " + error);
>                 } catch (SecurityException e) {
>                         String error = e.getMessage();
>                         Log.e(TAG, "Can't copy database from previous edition 
> " + error);
>                 } catch (IOException e) {
>                         String error = e.getMessage();
>                         Log.e(TAG, "Can't copy database from previous edition 
> " + error);
>                 }
>         }
>
> I have tried generating a signed version of my app and installing it,
> in case the shared user id does not work with unsigned debug code, but
> that didn't seem to change the behavior at all.
>
> I would really appreciate some help, as I cannot figure out why my two
> versions of the application are getting assigned different uids by
> Android when they both have the same shared user id string value.
>
> If I use CONTEXT_IGNORE_SECURITY instead of CONTEXT_INCLUDE_CODE it
> gets past the call to createPackageContext without any
> SecurityException.  It is able to detect that the free database file
> exists and can see the correct size of this file.  But when I call to
> create the InputStream it generates a FileNotFoundException.
>
> I am guessing that the problem is because the SecurityException
> reports that each application has a different UID.  However since I
> specified the same sharedUserId in the manifest file for both
> applications I don't understand why they have different UID values.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to