Intereting Posts
Как получить исходный код встроенных методов для Android Android: мое приложение слишком велико и дает «Невозможно выполнить dex: идентификатор метода не в : 65536»? Android: скрыть дочерние разделители в ExpandableListView Потоковая передача с M3U на Android Как реализовать мульти-выбор в RecyclerView? Рисование квадратного макета внутри круга Добавить новый элемент в значок на кнопке – Android Привязать к сервису из нового контекста для изменения конфигурации или привязки из контекста приложения? Как переопределить поведение кнопок громкости в приложении Android? Android, как получить доступ к исходным ресурсам, которые я установил в папку res? Виртуальное устройство Android Studio на виртуальной машине Windows 7 не совместимо Ни пользователь, ни текущий процесс не имеют android.permission.ACCESS_COARSE_LOCATION Как я могу заставить давление памяти для отладки Android? Волейбол и AsyncTask Установите комбинацию вибрации, света или звука для уведомления в андроиде

Как открыть личные файлы, сохраненные во внутреннем хранилище, с помощью 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