如何使用Intent.ACTION_VIEW打开保存到内部存储的私人文件?

我正在尝试一个示例程序来存储文件在内部存储和打开它使用Intent.ACTION_VIEW。

为了以私人模式存储文件,我遵循了这里提供的步骤。

我能够在/data/data/com.storeInternal.poc/files中的内部存储中find创build的文件。

但是,当我试图打开文件,它不会打开。

请在下面find我使用的代码。

public class InternalStoragePOCActivity extends Activity { /** Called when the activity is first created. */ String FILENAME = "hello_file.txt"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); createFile(); openFile(FILENAME); } public FileOutputStream getStream(String path) throws FileNotFoundException { return openFileOutput(path, Context.MODE_PRIVATE); } public void createFile(){ String string = "hello world!"; FileOutputStream fout = null; try { //getting output stream fout = getStream(FILENAME); //writng data fout.write(string.getBytes()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(fout!=null){ //closing the output stream try { fout.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void openFile(String filePath) { try { File temp_file = new File(filePath); Uri data = Uri.fromFile(temp_file); String type = getMimeType(data.toString()); Intent intent = new Intent(android.content.Intent.ACTION_VIEW); intent.setDataAndType(data, type); startActivity(intent); } catch (Exception e) { Log.d("Internal Storage POC ", "No Supported Application found to open this file"); e.printStackTrace(); } } public static String getMimeType(String url) { String type = null; String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null) { MimeTypeMap mime = MimeTypeMap.getSingleton(); type = mime.getMimeTypeFromExtension(extension); } return type; } } 

我怎样才能打开存储使用Context.MODE_PRIVATE由任何其他现有的/适当的应用程序的文件。 例如:file.pdf应该由PDF阅读器,video播放器等打开。

Solutions Collecting From Web of "如何使用Intent.ACTION_VIEW打开保存到内部存储的私人文件?"

您不能在内部存储器中共享/发送文件,如通过URI引用,通过意向到另一个应用程序。 应用程序无法读取其他应用程序的私人数据(除非通过内容提供程序)。 您在意图(而不是实际的文件本身)中传递文件的URI,接收意图的应用程序需要能够从该URI读取。

最简单的解决scheme是先将文件复制到外部存储并从那里共享。 如果您不想这样做,请创build一个Content Provider来公开您的文件。 一个例子可以在这里find: 从内部存储创build和共享文件

编辑:要使用内容提供者:

首先如下创build您的内容提供者类。 这里重要的覆盖是'openFile'。 当使用文件URI调用内容提供者时,此方法将运行并为其返回一个ParcelFileDescriptor。 其他方法也需要存在,因为它们在ContentProvider中是抽象的。

 public class MyProvider extends ContentProvider { @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { File privateFile = new File(getContext().getFilesDir(), uri.getPath()); return ParcelFileDescriptor.open(privateFile, ParcelFileDescriptor.MODE_READ_ONLY); } @Override public int delete(Uri arg0, String arg1, String[] arg2) { return 0; } @Override public String getType(Uri arg0) { return null; } @Override public Uri insert(Uri arg0, ContentValues arg1) { return null; } @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3, String arg4) { return null; } @Override public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { return 0; } } 

在应用程序标签内的Manifest中定义您的提供者,其中exported = true以允许其他应用程序使用它:

 <provider android:name=".MyProvider" android:authorities="your.package.name" android:exported="true" /> 

在你的Activity中的openFile()方法中,设置一个URI如下。 这个URI指向包中的内容提供者以及文件名:

 Uri uri = Uri.parse("content://your.package.name/" + filePath); 

最后,设置这个uri的意图是:

 intent.setDataAndType(uri, type); 

记得在上面使用'your.package.name'的地方插入你自己的软件包名称。

  File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "Foder path" + "/" + "File Name"); Uri uri = Uri.fromFile(file); Intent in = new Intent(Intent.ACTION_VIEW); in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); in.setDataAndType(uri, "mime type"); startActivity(in); 

[注:请根据您的文件typesselectMIMEtypes]

如果任何人仍然面临像这样的问题:该文件无法访问。 这可能会帮助你。 与内容提供商一起,您还必须设置以下标志…

 intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

要么

 intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 

我需要声誉PLZ:D