Как открыть личные файлы, сохраненные во внутреннем хранилище, с помощью Intent.ACTION_VIEW?
Я пытаюсь использовать пример программы для сохранения файла во внутреннем хранилище и открытия его с помощью Intent.ACTION_VIEW.
Для хранения файла в приватном режиме я следовал инструкциям, приведенным здесь.
Мне удалось найти созданный файл во внутреннем хранилище по адресу /data/data/com.storeInternal.poc/files .*
Но когда я пытался открыть файл, он не открывается.
Пожалуйста, найдите ниже код, который я использовал для этого.
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, любым другим существующим / соответствующим приложением. Например: файл.pdf должен открываться программой чтения PDF-файлов, видео-плеерами и т. Д.
3 ответа
Вы не можете совместно использовать / отправлять файл во внутреннее хранилище, на которое ссылается URI, через намерение в другое приложение. Приложение не может прочитать личные данные другого приложения (если это не через поставщика контента). Вы передаете URI файла в намерении (а не в самом файле), и приложение, которое получает намерение, должно иметь возможность чтения с этого URI.
Самое простое решение - сначала скопировать файл на внешнее хранилище и поделиться им оттуда. Если вы не хотите этого делать, создайте контент-провайдер, чтобы открыть ваш файл. Пример можно найти здесь: создать и поделиться файлом из внутреннего хранилища
РЕДАКТИРОВАТЬ: Чтобы использовать контент-провайдера:
Сначала создайте свой класс поставщика контента, как показано ниже. Важным переопределением здесь является "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;
}
}
Определите своего провайдера в манифесте в теге приложения, используя exported=true, чтобы другие приложения могли его использовать:
<provider android:name=".MyProvider" android:authorities="your.package.name" android:exported="true" />
В методе openFile(), который есть в вашем Activity, установите URI, как показано ниже. Этот URI указывает на поставщика содержимого в вашем пакете вместе с именем файла:
Uri uri = Uri.parse("content://your.package.name/" + filePath);
Наконец, установите этот URI в намерении:
intent.setDataAndType(uri, type);
Не забудьте вставить свое собственное имя пакета, где я использовал "your.package.name" выше.
Если кто-то все еще сталкивается с такой проблемой, как: файл не может быть доступен. Это может помочь тебе. Наряду с провайдером контента, вам также нужно установить следующий флаг...
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
или же
intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
Мне нужна репутация плз:D
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);
[Примечание: пожалуйста, выберите тип пантомимы согласно вашему типу файла]