Loading app/src/main/AndroidManifest.xml +2 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,8 @@ package="com.gsnathan.pdfviewer"> <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".App" Loading app/src/main/java/com/gsnathan/pdfviewer/DownloadPDFFile.java 0 → 100644 +114 −0 Original line number Diff line number Diff line package com.gsnathan.pdfviewer; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; import java.net.HttpURLConnection; import java.net.URL; import java.security.cert.Certificate; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.SSLPeerUnverifiedException; /** * This class is used to get a PDF File from an URL */ public class DownloadPDFFile extends AsyncTask<String, Void, Object> { // a reference to our MainActivity, this is used to be able to call saveFileAndDisplay() private WeakReference<MainActivity> mainActivityWR; public DownloadPDFFile(MainActivity activity) { mainActivityWR = new WeakReference<>(activity); } @Override protected Object doInBackground(String... strings) { File file; String url = strings [0]; String filename = strings[1]; InputStream inputStream; MainActivity activity = mainActivityWR.get(); int responseCode; try { URL uri = new URL(url); if (url.startsWith("https")) { Log.i("DownloadPDFFile", "HTTPS CONNECTION"); HttpsURLConnection urlConnection = (HttpsURLConnection) uri.openConnection(); urlConnection.connect(); responseCode = urlConnection.getResponseCode(); if (responseCode == 200) { Certificate[] certs = urlConnection.getServerCertificates(); for (Certificate cert : certs) Log.i("DownloadPDFFile", "Certificate : " + "\n - Type : " + cert.getType() + "\n - Hash Code : " + cert.hashCode() + "\n - Public Key Algorithm : " + cert.getPublicKey().getAlgorithm() + "\n - Public Key Format : " + cert.getPublicKey().getFormat() ); inputStream = new BufferedInputStream(urlConnection.getInputStream()); file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream); } else { Log.e("DownloadPDFFile", "Error request https, response code : " + responseCode); return responseCode; } urlConnection.disconnect(); } else { Log.i("DownloadPDFFile", "HTTP CONNECTION"); HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection(); urlConnection.connect(); responseCode = urlConnection.getResponseCode(); if (responseCode == 200) { inputStream = new BufferedInputStream(urlConnection.getInputStream()); file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream); } else { Log.e("DownloadPDFFile", "Error request http, response code : " + responseCode); return responseCode; } urlConnection.disconnect(); } } catch (SSLPeerUnverifiedException e) { Log.e("DownloadPDFFile", "Error SSL Peer Unverified Exception"); return e; } catch (SSLHandshakeException e) { Log.e("DownloadPDFFile", "Error SSL Handshake Exception"); return e; } catch (IOException e) { Log.e("DownloadPDFFile", "Error cannot get file at URL :" + url); e.printStackTrace(); return e; } return file; } @Override protected void onPostExecute(Object result) { MainActivity activity = mainActivityWR.get(); if (activity != null) { // Manage error if (result == null) { Toast.makeText(activity.getApplicationContext(), R.string.toast_io_exception, Toast.LENGTH_SHORT).show(); } else if (result instanceof Integer) { Toast.makeText(activity.getApplicationContext(), R.string.toast_http_code_error + String.valueOf(result), Toast.LENGTH_SHORT).show(); } else if (result instanceof SSLPeerUnverifiedException || result instanceof SSLHandshakeException) { Toast.makeText(activity.getApplicationContext(), R.string.toast_ssl_error, Toast.LENGTH_SHORT).show(); } else if (result instanceof IOException) { Toast.makeText(activity.getApplicationContext(), R.string.toast_io_exception, Toast.LENGTH_SHORT).show(); } else if (result instanceof File) { activity.saveFileAndDisplay((File) result); } } } } app/src/main/java/com/gsnathan/pdfviewer/MainActivity.java +109 −14 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ package com.gsnathan.pdfviewer; import android.Manifest; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; Loading @@ -32,6 +33,7 @@ import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Environment; import android.os.StrictMode; import android.preference.PreferenceManager; import android.print.PrintAttributes; Loading Loading @@ -73,6 +75,13 @@ import org.androidannotations.annotations.NonConfigurationInstance; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.ViewById; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.List; @EActivity(R.layout.activity_main) Loading @@ -84,10 +93,11 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen private PrintManager mgr = null; private final static int REQUEST_CODE = 42; public static final int PERMISSION_CODE = 42042; public static final int PERMISSION_WRITE = 42041; public static final int PERMISSION_READ = 42042; public static final String SAMPLE_FILE = "pdf_sample.pdf"; public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE"; private static String PDF_PASSWORD = ""; private SharedPreferences prefManager; Loading @@ -95,6 +105,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); pdfFileName = ""; prefManager = PreferenceManager.getDefaultSharedPreferences(this); onFirstInstall(); onFirstUpdate(); Loading Loading @@ -167,15 +178,17 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen String pdfFileName; String pdfTempFilePath; private void pickFile() { int permissionCheck = ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE); Manifest.permission.READ_EXTERNAL_STORAGE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{READ_EXTERNAL_STORAGE}, PERMISSION_CODE new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_READ ); return; Loading Loading @@ -276,7 +289,13 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen SharedPreferences.Editor editor = prefManager.edit(); editor.putString("uri", uri.toString()); editor.apply(); String scheme = uri.getScheme(); if (scheme != null && scheme.contains("http")) { // we will get the pdf asynchronously with the DownloadPDFFile object DownloadPDFFile DownloadPDFFile = new DownloadPDFFile(this); DownloadPDFFile.execute(uri.toString(), pdfFileName); } else { pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); pdfView.fromUri(uri) Loading @@ -295,7 +314,73 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen .pageSnap(prefManager.getBoolean("snap_pref", false)) .pageFling(prefManager.getBoolean("fling_pref", false)) .load(); } } void displayFromFile(File file) { pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); pdfView.fromFile(file) .defaultPage(pageNumber) .onPageChange(this) .enableAnnotationRendering(true) .enableAntialiasing(prefManager.getBoolean("alias_pref", false)) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) .spacing(10) // in dp .onPageError(this) .pageFitPolicy(FitPolicy.BOTH) .password(PDF_PASSWORD) .swipeHorizontal(prefManager.getBoolean("scroll_pref", false)) .autoSpacing(prefManager.getBoolean("scroll_pref", false)) .pageSnap(prefManager.getBoolean("snap_pref", false)) .pageFling(prefManager.getBoolean("fling_pref", false)) .load(); } public void saveFileAndDisplay (File file) { String filePath = saveTempFileToFile(file); pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); File newFile = new File(filePath); displayFromFile(newFile); } String saveTempFileToFile(File tempFile) { try { // check if the permission to write to external storage is granted if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { InputStream inputStream = new FileInputStream(tempFile); File newFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), pdfFileName); OutputStream outputStream = new FileOutputStream(newFile); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); return tempFile.getPath(); } else { // case if the permission hasn't been granted, we will store the pdf in a temp file //store the temporary file path, to be able to save it when permission will be granted // request for the permission to write to external storage ActivityCompat.requestPermissions( this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }, PERMISSION_WRITE ); return pdfTempFilePath; } } catch (IOException e) { Log.e(TAG, "Error on file : " + e.getMessage()); e.printStackTrace(); } return null; } void navToSettings() { Loading @@ -318,7 +403,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen public String getFileName(Uri uri) { String result = null; if (uri.getScheme().equals("content")) { if (uri.getScheme() != null && uri.getScheme().equals("content")) { Cursor cursor = getContentResolver().query(uri, null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { Loading Loading @@ -401,13 +486,23 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { int indexPermission; switch (requestCode) { case PERMISSION_READ: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.READ_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { launchPicker(); } break; case PERMISSION_WRITE: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.WRITE_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { File file = new File(pdfTempFilePath); saveTempFileToFile(file); } break; } } Loading app/src/main/java/com/gsnathan/pdfviewer/Utils.java +25 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ package com.gsnathan.pdfviewer; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; Loading @@ -33,8 +34,13 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; Loading Loading @@ -98,4 +104,23 @@ public class Utils { static String getAppVersion() { return BuildConfig.VERSION_NAME; } static void readFromInputStreamToOutputStream (InputStream inputStream, OutputStream outputStream) throws IOException { byte[] buffer = new byte[8 * 1024]; int bytesRead = inputStream.read(buffer); while (bytesRead > -1) { outputStream.write(buffer, 0, bytesRead); bytesRead = inputStream.read(buffer); } outputStream.flush(); outputStream.close(); } static File createFileFromInputStream (File cacheDir, String fileName, InputStream inputStream) throws IOException { File file = File.createTempFile(fileName, null, cacheDir); OutputStream outputStream = new FileOutputStream(file); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); return file; } } app/src/main/res/values-de/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,9 @@ <resources> <string name="pick_file">Datei auswählen</string> <string name="toast_pick_file_error">Datei konnte nicht ausgewählt werden. Bitte überprüfen Sie Ihren Dateimanager.</string> <string name="toast_http_code_error">Seiten-Ladefehler, http error code : </string> <string name="toast_io_exception">Aus unbekannten Gründen konnte diese Seite nicht geladen werden.</string> <string name="toast_ssl_error">Fehler: Gesicherte Verbindung fehlgeschlagen.</string> <string name="action_about">Über</string> <string name="version">Version</string> <string name="intro">Einführung wiederholen</string> Loading Loading
app/src/main/AndroidManifest.xml +2 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,8 @@ package="com.gsnathan.pdfviewer"> <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".App" Loading
app/src/main/java/com/gsnathan/pdfviewer/DownloadPDFFile.java 0 → 100644 +114 −0 Original line number Diff line number Diff line package com.gsnathan.pdfviewer; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; import java.net.HttpURLConnection; import java.net.URL; import java.security.cert.Certificate; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.SSLPeerUnverifiedException; /** * This class is used to get a PDF File from an URL */ public class DownloadPDFFile extends AsyncTask<String, Void, Object> { // a reference to our MainActivity, this is used to be able to call saveFileAndDisplay() private WeakReference<MainActivity> mainActivityWR; public DownloadPDFFile(MainActivity activity) { mainActivityWR = new WeakReference<>(activity); } @Override protected Object doInBackground(String... strings) { File file; String url = strings [0]; String filename = strings[1]; InputStream inputStream; MainActivity activity = mainActivityWR.get(); int responseCode; try { URL uri = new URL(url); if (url.startsWith("https")) { Log.i("DownloadPDFFile", "HTTPS CONNECTION"); HttpsURLConnection urlConnection = (HttpsURLConnection) uri.openConnection(); urlConnection.connect(); responseCode = urlConnection.getResponseCode(); if (responseCode == 200) { Certificate[] certs = urlConnection.getServerCertificates(); for (Certificate cert : certs) Log.i("DownloadPDFFile", "Certificate : " + "\n - Type : " + cert.getType() + "\n - Hash Code : " + cert.hashCode() + "\n - Public Key Algorithm : " + cert.getPublicKey().getAlgorithm() + "\n - Public Key Format : " + cert.getPublicKey().getFormat() ); inputStream = new BufferedInputStream(urlConnection.getInputStream()); file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream); } else { Log.e("DownloadPDFFile", "Error request https, response code : " + responseCode); return responseCode; } urlConnection.disconnect(); } else { Log.i("DownloadPDFFile", "HTTP CONNECTION"); HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection(); urlConnection.connect(); responseCode = urlConnection.getResponseCode(); if (responseCode == 200) { inputStream = new BufferedInputStream(urlConnection.getInputStream()); file = Utils.createFileFromInputStream(activity.getCacheDir(), filename, inputStream); } else { Log.e("DownloadPDFFile", "Error request http, response code : " + responseCode); return responseCode; } urlConnection.disconnect(); } } catch (SSLPeerUnverifiedException e) { Log.e("DownloadPDFFile", "Error SSL Peer Unverified Exception"); return e; } catch (SSLHandshakeException e) { Log.e("DownloadPDFFile", "Error SSL Handshake Exception"); return e; } catch (IOException e) { Log.e("DownloadPDFFile", "Error cannot get file at URL :" + url); e.printStackTrace(); return e; } return file; } @Override protected void onPostExecute(Object result) { MainActivity activity = mainActivityWR.get(); if (activity != null) { // Manage error if (result == null) { Toast.makeText(activity.getApplicationContext(), R.string.toast_io_exception, Toast.LENGTH_SHORT).show(); } else if (result instanceof Integer) { Toast.makeText(activity.getApplicationContext(), R.string.toast_http_code_error + String.valueOf(result), Toast.LENGTH_SHORT).show(); } else if (result instanceof SSLPeerUnverifiedException || result instanceof SSLHandshakeException) { Toast.makeText(activity.getApplicationContext(), R.string.toast_ssl_error, Toast.LENGTH_SHORT).show(); } else if (result instanceof IOException) { Toast.makeText(activity.getApplicationContext(), R.string.toast_io_exception, Toast.LENGTH_SHORT).show(); } else if (result instanceof File) { activity.saveFileAndDisplay((File) result); } } } }
app/src/main/java/com/gsnathan/pdfviewer/MainActivity.java +109 −14 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ package com.gsnathan.pdfviewer; import android.Manifest; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; Loading @@ -32,6 +33,7 @@ import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Environment; import android.os.StrictMode; import android.preference.PreferenceManager; import android.print.PrintAttributes; Loading Loading @@ -73,6 +75,13 @@ import org.androidannotations.annotations.NonConfigurationInstance; import org.androidannotations.annotations.OnActivityResult; import org.androidannotations.annotations.ViewById; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.List; @EActivity(R.layout.activity_main) Loading @@ -84,10 +93,11 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen private PrintManager mgr = null; private final static int REQUEST_CODE = 42; public static final int PERMISSION_CODE = 42042; public static final int PERMISSION_WRITE = 42041; public static final int PERMISSION_READ = 42042; public static final String SAMPLE_FILE = "pdf_sample.pdf"; public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE"; private static String PDF_PASSWORD = ""; private SharedPreferences prefManager; Loading @@ -95,6 +105,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); pdfFileName = ""; prefManager = PreferenceManager.getDefaultSharedPreferences(this); onFirstInstall(); onFirstUpdate(); Loading Loading @@ -167,15 +178,17 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen String pdfFileName; String pdfTempFilePath; private void pickFile() { int permissionCheck = ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE); Manifest.permission.READ_EXTERNAL_STORAGE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{READ_EXTERNAL_STORAGE}, PERMISSION_CODE new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_READ ); return; Loading Loading @@ -276,7 +289,13 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen SharedPreferences.Editor editor = prefManager.edit(); editor.putString("uri", uri.toString()); editor.apply(); String scheme = uri.getScheme(); if (scheme != null && scheme.contains("http")) { // we will get the pdf asynchronously with the DownloadPDFFile object DownloadPDFFile DownloadPDFFile = new DownloadPDFFile(this); DownloadPDFFile.execute(uri.toString(), pdfFileName); } else { pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); pdfView.fromUri(uri) Loading @@ -295,7 +314,73 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen .pageSnap(prefManager.getBoolean("snap_pref", false)) .pageFling(prefManager.getBoolean("fling_pref", false)) .load(); } } void displayFromFile(File file) { pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); pdfView.fromFile(file) .defaultPage(pageNumber) .onPageChange(this) .enableAnnotationRendering(true) .enableAntialiasing(prefManager.getBoolean("alias_pref", false)) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) .spacing(10) // in dp .onPageError(this) .pageFitPolicy(FitPolicy.BOTH) .password(PDF_PASSWORD) .swipeHorizontal(prefManager.getBoolean("scroll_pref", false)) .autoSpacing(prefManager.getBoolean("scroll_pref", false)) .pageSnap(prefManager.getBoolean("snap_pref", false)) .pageFling(prefManager.getBoolean("fling_pref", false)) .load(); } public void saveFileAndDisplay (File file) { String filePath = saveTempFileToFile(file); pdfView.useBestQuality(prefManager.getBoolean("quality_pref", false)); File newFile = new File(filePath); displayFromFile(newFile); } String saveTempFileToFile(File tempFile) { try { // check if the permission to write to external storage is granted if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { InputStream inputStream = new FileInputStream(tempFile); File newFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), pdfFileName); OutputStream outputStream = new FileOutputStream(newFile); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); return tempFile.getPath(); } else { // case if the permission hasn't been granted, we will store the pdf in a temp file //store the temporary file path, to be able to save it when permission will be granted // request for the permission to write to external storage ActivityCompat.requestPermissions( this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }, PERMISSION_WRITE ); return pdfTempFilePath; } } catch (IOException e) { Log.e(TAG, "Error on file : " + e.getMessage()); e.printStackTrace(); } return null; } void navToSettings() { Loading @@ -318,7 +403,7 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen public String getFileName(Uri uri) { String result = null; if (uri.getScheme().equals("content")) { if (uri.getScheme() != null && uri.getScheme().equals("content")) { Cursor cursor = getContentResolver().query(uri, null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { Loading Loading @@ -401,13 +486,23 @@ public class MainActivity extends ProgressActivity implements OnPageChangeListen } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { int indexPermission; switch (requestCode) { case PERMISSION_READ: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.READ_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { launchPicker(); } break; case PERMISSION_WRITE: indexPermission = Arrays.asList(permissions).indexOf(Manifest.permission.WRITE_EXTERNAL_STORAGE); if (indexPermission != -1 && grantResults[indexPermission] == PackageManager.PERMISSION_GRANTED) { File file = new File(pdfTempFilePath); saveTempFileToFile(file); } break; } } Loading
app/src/main/java/com/gsnathan/pdfviewer/Utils.java +25 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ package com.gsnathan.pdfviewer; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; Loading @@ -33,8 +34,13 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; Loading Loading @@ -98,4 +104,23 @@ public class Utils { static String getAppVersion() { return BuildConfig.VERSION_NAME; } static void readFromInputStreamToOutputStream (InputStream inputStream, OutputStream outputStream) throws IOException { byte[] buffer = new byte[8 * 1024]; int bytesRead = inputStream.read(buffer); while (bytesRead > -1) { outputStream.write(buffer, 0, bytesRead); bytesRead = inputStream.read(buffer); } outputStream.flush(); outputStream.close(); } static File createFileFromInputStream (File cacheDir, String fileName, InputStream inputStream) throws IOException { File file = File.createTempFile(fileName, null, cacheDir); OutputStream outputStream = new FileOutputStream(file); Utils.readFromInputStreamToOutputStream(inputStream, outputStream); return file; } }
app/src/main/res/values-de/strings.xml +3 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,9 @@ <resources> <string name="pick_file">Datei auswählen</string> <string name="toast_pick_file_error">Datei konnte nicht ausgewählt werden. Bitte überprüfen Sie Ihren Dateimanager.</string> <string name="toast_http_code_error">Seiten-Ladefehler, http error code : </string> <string name="toast_io_exception">Aus unbekannten Gründen konnte diese Seite nicht geladen werden.</string> <string name="toast_ssl_error">Fehler: Gesicherte Verbindung fehlgeschlagen.</string> <string name="action_about">Über</string> <string name="version">Version</string> <string name="intro">Einführung wiederholen</string> Loading