Intereting Posts
HorizontalScrollView: авто-прокрутка до конца при добавлении новых просмотров? Не удалось создать Android AVD из-за настроек Target и CPU / ABI? Проблема с DexIndexOverflowException после обновления до последней библиотеки приложений и поддержки Есть ли способ проверить, поддерживает ли Android-устройство openGL ES 2.0? Android ImageView масштабирует меньшее изображение до ширины с гибкой высотой без обрезки или искажения Android ListView заголовки Android – Как использовать SharedPreferences в классе non-Activity? SetRadius on Circle дает пользователям плохой опыт работы на Картах Google Менеджер загрузки Android завершен Как узнать, какой взгляд сосредоточен? Скрыть мягкую клавиатуру при нажатии клавиши возврата Получить новое положение координаты после вращения с помощью матрицы Активность просочилась в окно com.android.internal.policy.impl.PhoneWindow$DecorView@44f72ff0, которое было первоначально добавлено здесь Как играть в видео как живые обои android? Android и зависимость от инъекций

Как открыть личные файлы, сохраненные во внутреннем хранилище, с помощью 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 , любым другим существующим / соответствующим приложением. Например: file.pdf следует открывать с помощью PDF-ридера, видеороликов и т. Д.

Solutions Collecting From Web of "Как открыть личные файлы, сохраненные во внутреннем хранилище, с помощью Intent.ACTION_VIEW?"

Вы не можете передавать / отправлять файл во внутреннем хранилище, как это указано в URI, через Intent для другого приложения. Приложение не может читать личные данные другого приложения (если только через Content Provider). Вы передаете URI файла в намерении (а не в самом фактическом файле), и приложение, которое получает намерение, должно быть в состоянии читать из этого URI.

Самое простое решение – сначала скопировать файл в внешнее хранилище и поделиться им оттуда. Если вы не хотите этого делать, создайте Content Provider, чтобы открыть файл. Пример можно найти здесь: Создание и совместное использование файла из внутреннего хранилища

EDIT: использование поставщика контента:

Сначала создайте свой контент-провайдер, как показано ниже. Важным переопределением здесь является «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 (), который у вас есть в вашей деятельности, настройте 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); 

[Примечание: выберите тип mime в соответствии с типом вашего файла]

Если кто-то еще сталкивается с такой проблемой, как: к файлу не удалось получить доступ. Это может помочь u. Наряду с поставщиком контента у вас также нужно установить следующий флаг …

 intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

или

 intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 

Мне нужна репутация plz: D