Это похоже на похожий вопрос. Пожалуйста, не помечайте его как дубликат, поскольку я попробовал все решения из стека, но не решил мою проблему.
AndroidManifest. xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
под тегом приложения:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
путь_поставщика. xml:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
FileDownloaded.class:
import android.support.v4.content.FileProvider;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class FileDownloader extends FileProvider {
private static final int MEGABYTE = 1024 * 1024;
public static void downloadFile(String fileUrl, File directory){
try {
URL url = new URL(fileUrl);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
//urlConnection.setRequestMethod("GET");
//urlConnection.setDoOutput(true);
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(directory);
int totalSize = urlConnection.getContentLength();
byte[] buffer = new byte[MEGABYTE];
int bufferLength = 0;
while((bufferLength = inputStream.read(buffer))>0 ){
fileOutputStream.write(buffer, 0, bufferLength);
}
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
кнопка onclick ():
@Override
public void onClick(View view) {
Observable<String> observable = Observable.just
("http://enos.itcollege.ee/~jpoial/allalaadimised/reading/Android-Programming-Cookbook.pdf");
DisposableObserver<String> observer = new DisposableObserver<String>() {
@Override
public void onNext(String s) {
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File folder = new File(extStorageDirectory, "test_the_pdf");
folder.mkdir();
File pdfFile = new File(folder, "Android-Programming-Cookbook.pdf");
try {
pdfFile.createNewFile();
} catch (IOException io) {
io.printStackTrace();
}
FileDownloader.downloadFile(s, pdfFile);
}
@Override
public void onError(Throwable e) {
Toast.makeText(HomeActivity.this, "Error", Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
File pdfFile_1 = new File(Environment.getExternalStorageDirectory() + "/test_the_pdf/" + "Android-Programming-Cookbook.pdf"); // -> filename = maven.pdf
//Uri path = Uri.fromFile(pdfFile);
Uri path = FileProvider.getUriForFile
(context, context.getApplicationContext().getPackageName()
+ ".provider", pdfFile_1);
if (pdfFile_1.exists())
{
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(path, "application/pdf");
/* pdfIntent.setFlags
(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);*/
pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
pdfIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
pdfIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// pdfIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
try {
startActivity(pdfIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(HomeActivity.this, "No Application available to view PDF", Toast.LENGTH_SHORT).show();
}
}
else
{
Toast.makeText(context, "Hello Workd", Toast.LENGTH_SHORT).show();
}
}
};
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
Я использовал Rx Java для обработки фонового процесса.
Все сделал правильно.
Примечание: Stil получает ту же проблему на Acbrobat Reader. Google pdf reader- открывает и закрывает снова.