I'm trying to launch an image which is written to my application directory with the builtin Android image viewer. This image has been written in a different part of the app to the app directory. When getting the following file:
super.getFilesDir() + "/current.png"
File.exists() returns true.
How can i launch the builtin Android image viewer to view this file? Currently i'm doing:
File f = new File(super.getFilesDir()+"/current.png");
uri = Uri.parse("file://"+super.getFilesDir()+"/current.png");
startActivity(new Intent(Intent.ACTION_VIEW, uri));
And it keeps churning out:
10-11 13:09:24.367: INFO/ActivityManager(564): Starting activity: Intent { act=android.intent.action.VIEW dat=file:///data/data/com.dav开发者_如何学Goidgoemans.myapp/files/current.png } 10-11 13:09:24.367: ERROR/myapp(2166): Exception occuredandroid.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///data/data/com.davidgoemans.myapp/files/current.png }
irrespective of what i change the uri schema to ( eg, content://, file://, media://, image:// ).
One way is to implement a context provider to give other applications access to your data.
Create a new class containing:
public class FileContentProvider extends ContentProvider {
private static final String URI_PREFIX = "content://uk.co.ashtonbrsc.examplefilecontentprovider";
public static String constructUri(String url) {
Uri uri = Uri.parse(url);
return uri.isAbsolute() ? url : URI_PREFIX + url;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
File file = new File(uri.getPath());
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
return parcel;
}
@Override
public boolean onCreate() {
return true;
}
@Override
public int delete(Uri uri, String s, String[] as) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public String getType(Uri uri) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
throw new UnsupportedOperationException("Not supported by this provider");
}
}
Add the content provider to your AndroidManifest.xml:
<provider android:name=".FileContentProvider" android:authorities="uk.co.ashtonbrsc.examplefilecontentprovider" />
You should then be able to use "content://uk.co.ashtonbrsc.examplefilecontentprovider/" + the full path to the image
in your ACTION_VIEW intent.
Option #1: Create a ContentProvider
to serve up the file out of your app's private file area, then use an ACTION_VIEW
Intent
on that content://
Uri
.
Option #2: Move the file to the SD card, and use an ACTION_VIEW
Intent
on the Uri
and also with the appropriate MIME type. Android does not automatically associate file extensions with MIME types, so you need to tell the Intent
what sort of MIME type the Uri
points to. This is handled for you "automatically" with the ContentProvider
.
Your image is within your application sandbox, so you should use ContentProvider
to give other apps external access to your image data. Keep in mind that in Android, pre-installed apps don't have higher priority than third-party apps - you still have to give permission to your data, even if you want to use the default apps.
Otherwise, take a look at the Gallery activity's IntentFilter
tags in the Camera application, for a reference what Intent
you can use to open an image with the default viewer.
精彩评论