3

将uri 用于 html 文件可以让 Chrome 和 Edge 等浏览器显示 html 页面ACTION_VIEWFileProvider还显示 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 时那样显示源代码?或者是什么让他们改为提供下载?

4

0 回答 0