Как организовать загрузку файлов из сети через WebView, который находится во фрагменте
Прошу о помощи, пишу диплом под Android API 26, создал основную деятельность приложения и тут возник вопрос о сохранении файлов с сайта, а именно docx файлов через WebView, который в свою очередь находится во фрагменте. Использовал этот код и он работает, но только в обычной MainActivity, с фрагментом безуспешно.
public class WebActivity extends Activity {
private static final String TAG="Diplom";
private WebView webview;
public String textOnWebActivity;
public String filename;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web);
ListView listView = findViewById(R.id.listView);
ArrayList<String> ArrayStringRasp = new ArrayList<>();
webview=(WebView)findViewById(R.id.mwebView);
webview.loadUrl("http://www.permaviat.ru/raspisanie-zamen/");
webview.setWebViewClient(new WebViewClient());
webview.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(final String url, final String userAgent, String contentDisposition, String mimetype, long contentLength)
{
//Checking runtime permission for devices above Marshmallow.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
downloadDialog(url,userAgent,contentDisposition,mimetype);
} else {
Log.v(TAG,"Permission is revoked");
//requesting permissions.
ActivityCompat.requestPermissions(WebActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
else {
//Code for devices below API 23 or Marshmallow
Log.v(TAG,"Permission is granted");
downloadDialog(url,userAgent,contentDisposition,mimetype);
}
}
});
}
public void downloadDialog(final String url,final String userAgent,String contentDisposition,String mimetype)
{
//getting filename from url.
filename = URLUtil.guessFileName(url,contentDisposition,mimetype);
//alertdialog
AlertDialog.Builder builder=new AlertDialog.Builder(WebActivity.this);
//title of alertdialog
builder.setTitle("Download");
//message of alertdialog
builder.setMessage("Do you want to save " +filename);//Имя файла расаеписания
//if Yes button clicks.
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//DownloadManager.Request created with url.
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
//cookie
String cookie=CookieManager.getInstance().getCookie(url);
//Add cookie and User-Agent to request
request.addRequestHeader("Cookie",cookie);
request.addRequestHeader("User-Agent",userAgent);
//file scanned by MediaScannar
request.allowScanningByMediaScanner();
//Download is visible and its progress, after completion too.
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//DownloadManager created
DownloadManager downloadManager=(DownloadManager)getSystemService(DOWNLOAD_SERVICE);
//Saving files in Download folder
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
//download enqued
downloadManager.enqueue(request);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
//cancel the dialog if Cancel clicks
dialog.cancel();
}
});
//alertdialog shows.
builder.create().show();
}
Прошу помощи и идей как адаптировать данный код для Fragment'a?
Ответы (1 шт):
Ваш код одинаково работает и в фрагменте и в активности(в сам код я не вникал) Опишите, пожалуйста, ошибку и код к ней приводящий.
Пишу в ответы, что бы вставить пример как я добавил Ваш код в фрагмент. downloadDialog переделал в статический метод для простоты.
public class WebFragment extends Fragment {
private static final String TAG="Diplom";
private WebView webview;
public String textOnWebActivity;
public WebFragment() {
//Для фрагментов используется пустой конструктор
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_web, container, false);
ListView listView = view.findViewById(R.id.listView);
ArrayList<String> ArrayStringRasp = new ArrayList<>();
webview=(WebView)view.findViewById(R.id.mwebView);
webview.loadUrl("http://www.permaviat.ru/raspisanie-zamen/");
webview.setWebViewClient(new WebViewClient());
webview.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(final String url, final String userAgent, String contentDisposition, String mimetype, long contentLength)
{
//Checking runtime permission for devices above Marshmallow.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && getActivity()!=null) {
if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
downloadDialog(getActivity(), url,userAgent,contentDisposition,mimetype);
} else {
Log.v(TAG,"Permission is revoked");
//requesting permissions.
ActivityCompat.requestPermissions( getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
else {
//Code for devices below API 23 or Marshmallow
Log.v(TAG,"Permission is granted");
downloadDialog(getContext(), url,userAgent,contentDisposition,mimetype);
}
}
});
// Inflate the layout for this fragment
return view;
}
public static void downloadDialog(Context context, final String url, final String userAgent, String contentDisposition, String mimetype)
{
//getting filename from url.
String filename = URLUtil.guessFileName(url,contentDisposition,mimetype);
//alertdialog
AlertDialog.Builder builder=new AlertDialog.Builder(context);
//title of alertdialog
builder.setTitle("Download");
//message of alertdialog
builder.setMessage("Do you want to save " +filename);//Имя файла расаеписания
//if Yes button clicks.
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//DownloadManager.Request created with url.
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
//cookie
String cookie= CookieManager.getInstance().getCookie(url);
//Add cookie and User-Agent to request
request.addRequestHeader("Cookie",cookie);
request.addRequestHeader("User-Agent",userAgent);
//file scanned by MediaScannar
request.allowScanningByMediaScanner();
//Download is visible and its progress, after completion too.
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//DownloadManager created
DownloadManager downloadManager=(DownloadManager)context.getSystemService(DOWNLOAD_SERVICE);
//Saving files in Download folder
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
//download enqued
downloadManager.enqueue(request);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
//cancel the dialog if Cancel clicks
dialog.cancel();
}
});
//alertdialog shows.
builder.create().show();
}
}
Сам фрагмент встроен в MainActivity таким образом
<fragment
android:id="@+id/activity_main__web_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="ru.boringbar.foranswers.WebFragment"/>