tags:

views:

111

answers:

1

Hi all,

I work for a cell company, our phones are based Android(SDK 1.5) we have the ability to sign our applications in our phones and give it firmware permissions, like:

installing an extern application while using PackageManager.(SDK 1.5)

this is what i did:

 File src = context.getFileStreamPath(fileName);
 Uri mPackageURI = Uri.parse(src.getAbsolutePath());    
PackageManager pm = context.getPackageManager();

int installFlags = 0;

try {
  PackageInfo pi = pm.getPackageInfo(packageName,
    PackageManager.GET_UNINSTALLED_PACKAGES);

  if (pi != null) {
    Log.debug(TAG, TAG + ":replacing  " + fileName);

    installFlags |= PackageManager.REPLACE_EXISTING_PACKAGE;
  }

} catch (NameNotFoundException e) { }

try {
    PackageInstallObserver observer = new PackageInstallObserver();
    pm.installPackage(mPackageURI, observer, installFlags);

} catch (SecurityException e) {
  //if the app is not signed by the manufacture it will get here a security exception
}


class PackageInstallObserver extends IPackageInstallObserver.Stub {
  public void packageInstalled(String packageName, int returnCode) {
  }
}

Now this is the wierd thing i get:

Since we are the manfucatures we dont get any exception while execute pm.installPackage(mPackageURI, observer, installFlags);

since we have signed our app with admin permissions.

but what we do get is this crazy result and the phone being RESTARTED.

threadid=21: thread exiting with uncaught exception (group=0x4000fe70)

07-11 16:29:38.493: ERROR/AndroidRuntime(2561): Uncaught handler: thread PackageManager exiting due to uncaught exception

07-11 16:29:38.493: ERROR/AndroidRuntime(2561): *** EXCEPTION IN SYSTEM PROCESS.  System will crash.

07-11 16:29:38.493: ERROR/AndroidRuntime(2561): java.lang.NullPointerException

07-11 16:29:38.493: ERROR/AndroidRuntime(2561):     at 
com.android.server.PackageManagerService.installPackageLI(PackageManagerService.java:3634)

07-11 16:29:38.493: ERROR/AndroidRuntime(2561):     at com.android.server.PackageManagerService.access$1500(PackageManagerService.java:120)

07-11 16:29:38.493: ERROR/AndroidRuntime(2561):     at com.android.server.PackageManagerService$5.run(PackageManagerService.java:3253)

07-11 16:29:38.493: ERROR/AndroidRuntime(2561):     at android.os.Handler.handleCallback(Handler.java:587)

07-11 16:29:38.493: ERROR/AndroidRuntime(2561):     at android.os.Handler.dispatchMessage(Handler.java:92)

07-11 16:29:38.493: ERROR/AndroidRuntime(2561):     at android.os.Looper.loop(Looper.java:123)

07-11 16:29:38.493: ERROR/AndroidRuntime(2561):     at android.os.HandlerThread.run(HandlerThread.java:60)

Second way: Ive also tried this way and I got diffrent exception:

*very similar to the first way, just the major difference is in this line:

 String src = String.format("file:///data/data/com.mirs.agentcore/files/%s", fileName);

 Uri mPackageURI = Uri.parse(src);

 PackageManager pm = context.getPackageManager();



 String src = String.format("file:///data/data/com.mirs.agentcore/files/%s", fileName);

 Uri mPackageURI = Uri.parse(src);

 PackageManager pm = context.getPackageManager();

 int installFlags = 0;

  .... //the rest of the code is the same as the First way(mention above)

After this code being executed(Second way), the phone continue normally, but I get this exception:

09-12 12:10:16.484: ERROR/PackageManager(6601): Couldn't copy package file to temp file.

A: 

I found the 1.5 source for PackageManagerService.java, and this looks like the code that's causing your problem:

 try {
    fd = mContext.getContentResolver().openFileDescriptor(pPackageURI, "r");
 } 
 catch (FileNotFoundException e) {
    Log.e(TAG, "Couldn't open file descriptor from download service.");
    res.returnCode = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;

    // This break statement was line 3634.
    break main_flow;
 }

The documentation for ContentResolver.openFileDescriptor says:

Throws FileNotFoundException if no file exists under the URI or the mode is invalid.

It looks like the problem is with your mPackageURI, so I would begin evaluating the values of fileName and Uri.parse(src.getAbsolutePath()).

Rob
Source at http://www.netmite.com/android/mydroid/1.5/frameworks/base/services/java/com/android/server/PackageManagerService.java
Rob
Hi Rob, so How do you think I should adjust the code? The file is already in the sdcard, in which other way I should channge it?
rayman
The documentation for `Uri.parse(uriString)` expects `uriString` to be an RFC 2396-compliant encoded URI. I expect the problem is that you are passing a local path `src.GetAbsolutePath()` that does not satisfy that requirement. However, you will need to check the value of your `fileName` variable and the return value of `getAbsolutePath()` to verify this.
Rob