Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Вы не можете делиться/отправлять файл во внутреннем хранилище, как это указано в URI, посредством намерения в другое приложение. Приложение не может читать другие личные данные приложения (если только через 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' выше.

Ответ 2

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

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

или же

intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);

Ответ 3

 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 в соответствии с типом вашего файла]