将uri 用于 html 文件可以让 Chrome 和 Edge 等浏览器显示 html 页面ACTION_VIEW
。FileProvider
还显示 HTML-viewer 应用程序。编辑器应用程序可以处理该文件。
如果使用ContentProvider
扩展 uri,则浏览器仅提供下载文件。HTML-viewer 显示一个不确定的进度条。我的应用程序和外部编辑器应用程序仍将读取和编辑该文件。所以提供作品。
我看到 Chrome、Edge 和 HTML-viewer 只调用 openFile() 和 getType()。
content://com.jmg.expas.fileprovider/external_files/Documents/index.html
content://com.jmg.expas.simpleprovider/storage/emulated/0/Documents/index.html
我不知道为什么两种内容方案都受到不同的对待。
这是简单的内容提供程序代码:
public class SimpleContentProvider extends ContentProvider
{
static String TAG = "simplecontentprovider";
public static Uri getUriForFile ( Context context, File file)
{
return Uri.parse("content://" + context.getPackageName() + ".simpleprovider" + file.getAbsolutePath());
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException
{
Log.d(TAG, "open-File() mode: " + mode ); // "w"
Log.d(TAG, "uri.getEncodedPath(): " + uri.getEncodedPath() );
String path = uri.getEncodedPath();
File f = new File(path);
if ( ! f.exists() )
{
Log.d(TAG, "path does not exist" );
throw new FileNotFoundException(
"in SimpleContentProvider\n"
+
uri.getPath() );
}
if ( mode.equals("r") )
return (ParcelFileDescriptor.open(f,ParcelFileDescriptor.MODE_READ_ONLY));
return (ParcelFileDescriptor.open(f,ParcelFileDescriptor.MODE_READ_WRITE));
}
private String getExtension ( String fileName )
{
int index = fileName.lastIndexOf(".");
if ( index < 0 )
return "";
return fileName.substring(index+1);
}
@Override
public String getType(Uri uri)
{
Log.d(TAG, "get-Type() getPath(): " + uri.getPath() );
String path = uri.getPath();
String extension = getExtension(path);
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
String mimeType = mimeTypeMap.getMimeTypeFromExtension(extension);
Log.d(TAG, "mimetype: " + mimeType + " for extension " + extension );
// O Oh Oh ..
//return extension;
return mimeType; // and problem solved ;-)
}
// Other member functions not used. They will be added by Android Studio
}
在清单中:
<provider
android:name=".SimpleContentProvider"
android:authorities="${applicationId}.simpleprovider"
android:enabled="true"
android:exported="true" />
利用:
String mimetype = "text/html";
String filePath = .... any filepath to a html file the app can read itself...
Uri uri = SimpleContentProvider.getUriForFile(context, new File(filePath));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, mimetype);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
);
context.startActivity(intent);
问题是:我必须做什么才能让浏览器像使用 FileProvider 时那样显示源代码?或者是什么让他们改为提供下载?