Partial Fix for Download with MediaStore

This commit is contained in:
toto 2022-02-08 14:23:21 +01:00
parent 057038cca7
commit 38eff704cd
4 changed files with 36 additions and 21 deletions

View File

@ -3,8 +3,10 @@ package com.localtransfer;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log; import android.util.Log;
import android.view.MenuItem; import android.view.MenuItem;
@ -61,8 +63,16 @@ public class SettingsActivity extends AppCompatActivity {
case REQUEST_DIRECTORY_PICKER: case REQUEST_DIRECTORY_PICKER:
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
String currentPath = data.getExtras().getString("data"); String currentPath = data.getExtras().getString("data");
if(currentPath.contains(Environment.getExternalStorageDirectory() + "/")) {
String save_location = currentPath.replace(Environment.getExternalStorageDirectory() + "/", ""); Uri uri;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
uri = MediaStore.Downloads.EXTERNAL_CONTENT_URI;
}
else {
uri = Uri.fromFile(Environment.getExternalStorageDirectory());
}
if(currentPath.contains(uri + "/")) {
String save_location = currentPath.replace(uri + "/", "");
Log.d("Path", save_location); Log.d("Path", save_location);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
prefs.edit().putString("local_storage", save_location).apply(); prefs.edit().putString("local_storage", save_location).apply();

View File

@ -26,6 +26,7 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.ProtocolException; import java.net.ProtocolException;
@ -288,7 +289,7 @@ public class Transfer {
return fileList; return fileList;
} }
public void downloadFile(final File file, String name, long fileSize, String href, Button button) throws IOException { public void downloadFile(final Uri uri, String name, long fileSize, String href, Button button) throws IOException {
/*final LinearLayout layout = activity.findViewById(id); /*final LinearLayout layout = activity.findViewById(id);
final Button button; final Button button;
@ -344,7 +345,7 @@ public class Transfer {
if (responseCode == HttpURLConnection.HTTP_OK) { if (responseCode == HttpURLConnection.HTTP_OK) {
FileOutputStream fileOutput = new FileOutputStream(file); OutputStream fileOutput = activity.getContentResolver().openOutputStream(uri);
InputStream in = conn.getInputStream(); InputStream in = conn.getInputStream();
while ((bufferLength = in.read(buffer)) > 0) { while ((bufferLength = in.read(buffer)) > 0) {

View File

@ -2,16 +2,16 @@ package com.localtransfer.fragment;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.ContentValues;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.os.Environment; import android.os.Environment;
import android.provider.MediaStore;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.Gravity; import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -26,7 +26,6 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import com.localtransfer.BuildConfig;
import com.localtransfer.Progress; import com.localtransfer.Progress;
import com.localtransfer.R; import com.localtransfer.R;
import com.localtransfer.Transfer; import com.localtransfer.Transfer;
@ -37,7 +36,6 @@ import org.json.JSONObject;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
@ -231,6 +229,17 @@ public class DownloadFragment extends Fragment {
save_location = Environment.getExternalStorageDirectory() + "/" + Transfer.local_storage; save_location = Environment.getExternalStorageDirectory() + "/" + Transfer.local_storage;
File file = new File(save_location, name); File file = new File(save_location, name);
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
values.put(MediaStore.MediaColumns.MIME_TYPE, mime);
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
Uri uri;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
uri = getContext().getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
}
else
uri = null;
file_buttons.setId(View.generateViewId()); file_buttons.setId(View.generateViewId());
@ -271,6 +280,7 @@ public class DownloadFragment extends Fragment {
file_buttons.setTag(R.id.ID_FILE_SIZE, size); file_buttons.setTag(R.id.ID_FILE_SIZE, size);
file_buttons.setTag(R.id.ID_FILE_HREF, href); file_buttons.setTag(R.id.ID_FILE_HREF, href);
file_buttons.setTag(R.id.ID_FILE_MIME, mime); file_buttons.setTag(R.id.ID_FILE_MIME, mime);
file_buttons.setTag(R.id.ID_FILE_URI, uri);
file_buttons.setTag(R.id.ID_SAVE_LOCATION, save_location); file_buttons.setTag(R.id.ID_SAVE_LOCATION, save_location);
int state = file_buttons.getVisibility(); int state = file_buttons.getVisibility();
if(state == LinearLayout.GONE) { if(state == LinearLayout.GONE) {
@ -300,15 +310,14 @@ public class DownloadFragment extends Fragment {
final String save_location = String.valueOf(layout.getTag(R.id.ID_SAVE_LOCATION)); final String save_location = String.valueOf(layout.getTag(R.id.ID_SAVE_LOCATION));
final long fileSize = (long) layout.getTag(R.id.ID_FILE_SIZE); final long fileSize = (long) layout.getTag(R.id.ID_FILE_SIZE);
final String href = (String) layout.getTag(R.id.ID_FILE_HREF); final String href = (String) layout.getTag(R.id.ID_FILE_HREF);
final String mime = (String) layout.getTag(R.id.ID_FILE_MIME);
new File(save_location).mkdirs(); final Uri uri = (Uri) layout.getTag(R.id.ID_FILE_URI);
File file = new File(save_location, name);
Transfer tr = new Transfer(); Transfer tr = new Transfer();
new Thread(() -> { new Thread(() -> {
try { try {
tr.downloadFile(file, name, fileSize, href, button); tr.downloadFile(uri, name, fileSize, href, button);
} catch (IOException e) { } catch (IOException e) {
final String ExceptionName = e.getClass().getSimpleName(); final String ExceptionName = e.getClass().getSimpleName();
final String ExceptionMess = e.getMessage(); final String ExceptionMess = e.getMessage();
@ -325,15 +334,12 @@ public class DownloadFragment extends Fragment {
LinearLayout layout = (LinearLayout) v.getParent(); LinearLayout layout = (LinearLayout) v.getParent();
final String name = (String) layout.getTag(R.id.ID_FILE_NAME); final String name = (String) layout.getTag(R.id.ID_FILE_NAME);
final String type = (String) layout.getTag(R.id.ID_FILE_MIME); final String type = (String) layout.getTag(R.id.ID_FILE_MIME);
final Uri uri = (Uri) layout.getTag(R.id.ID_FILE_URI);
final String save_location = String.valueOf(layout.getTag(R.id.ID_SAVE_LOCATION));
File file = new File(save_location, name);
Uri uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file);
if(type.equals("text/plain")) { if(type.equals("text/plain")) {
String text = null; String text = null;
try { try {
InputStream is = new FileInputStream(file); InputStream is = getActivity().getContentResolver().openInputStream(uri);
BufferedReader buf = new BufferedReader(new InputStreamReader(is)); BufferedReader buf = new BufferedReader(new InputStreamReader(is));
String line; String line;
@ -377,10 +383,7 @@ public class DownloadFragment extends Fragment {
LinearLayout layout = (LinearLayout) v.getParent(); LinearLayout layout = (LinearLayout) v.getParent();
final String name = (String) layout.getTag(R.id.ID_FILE_NAME); final String name = (String) layout.getTag(R.id.ID_FILE_NAME);
final String type = (String) layout.getTag(R.id.ID_FILE_MIME); final String type = (String) layout.getTag(R.id.ID_FILE_MIME);
final Uri uri = (Uri) layout.getTag(R.id.ID_FILE_URI);
final String save_location = String.valueOf(layout.getTag(R.id.ID_SAVE_LOCATION));
File file = new File(save_location, name);
Uri uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file);
try { try {
Intent intent = new Intent(Intent.ACTION_VIEW); Intent intent = new Intent(Intent.ACTION_VIEW);

View File

@ -4,6 +4,7 @@
<item name="ID_FILE_SIZE" type="id" /> <item name="ID_FILE_SIZE" type="id" />
<item name="ID_FILE_HREF" type="id" /> <item name="ID_FILE_HREF" type="id" />
<item name="ID_FILE_MIME" type="id" /> <item name="ID_FILE_MIME" type="id" />
<item name="ID_FILE_URI" type="id" />
<item name="ID_SAVE_LOCATION" type="id" /> <item name="ID_SAVE_LOCATION" type="id" />
<item name="ID_FILE_BUTTONS" type="id" /> <item name="ID_FILE_BUTTONS" type="id" />
</resources> </resources>