Ваш код немного неуклюжий и гарантированно будет содержать ошибки в последних версиях Android. Вот несколько наблюдений:
Решение 1
1. Используйте File Provider
и пишите в личное хранилище.
Я знаю, что вы пишете в основное хранилище, поэтому другие приложения могут читать файл, но этого делать не следует. Используйте файлового провайдера и получите от него Uri. Вот документация: Документация поставщика файлов. Когда у вас настроен поставщик файлов (поверьте, это просто, вам просто нужно добавить фрагмент в свой манифест и добавить путь xml), вы можете записывать конфиденциально в память. Нравится:
FileOutputStream fOut = openFileOutput("the_name_of_file_here", Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
Затем, используя getUriForFile
, вы можете получить Uri, который будет использоваться любым приложением, которому вы даете доступ. Нравится:
File file = new File(getFilesDir(), "the_name_of_file_here");
Uri uri = getUriForFile(this, "com.yourpackagename.fileprovider", file);
2. Используйте ShareCompat
Когда вы настроите FileProvider
, я предлагаю вам для совместного использования файлов использовать ShareCompat
вместо обычного действия по совместному использованию. Преимущество ShareCompat в том, что он официально поддерживается Google, и вы также можете делиться с ним множеством файлов. Без необходимости предоставлять URI_PERMISSION
другому приложению. Вот пример:
Intent shareIntent = ShareCompat.IntentBuilder.from(this)
.setType(type) //This is the MIME type
.setStream(uri) //This is the uri we got earlier
.getIntent();
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(shareIntent); //Starting the activity
Советую вам заглянуть в этот блог: Начало работы с Share -Compat для получения дополнительной информации. Надеюсь это поможет.
Решение 2
Традиционное решение:
Если вы по-прежнему хотите использовать свою функцию из-за ваших предпочтений или потому, что она лучше подходит вашему приложению, вот что вы можете сделать:
Вместо использования startActivity(Intent)
используйте startActivityForResult(Intent, int)
. При этом вы можете передать целочисленное значение, которое будет работать как идентификатор. Затем, когда к файлу предоставлен доступ и вы вернетесь в свое приложение, функция onActivityResult()
будет запущена. У него будет requestCode
. Нравится:
//Create your share intent as you do in your code, then:
startActivityForResult(intent, 512); //I passed 512 you can pass anything you want
Затем переопределите эту функцию:
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//Check if it is from the same code, if yes delete the temp file
if(requestCode == 512) {
tempFile.delete();
}
}
person
Gaurav Mall
schedule
15.08.2019