バックグラウンドでWebサーバーからjsonファイルをダウンロードして外部メモリに保存する必要があるアプリを開発しています。アクティビティをロードするたびに、最初にファイルを読み取ってデータを入力します(存在しない場合ファイルはアセット ファイルを使用します) が、バックグラウンドで (一定の時間が経過するたびに) ファイルを更新します。
問題は、私がこれを行うことができ、正常に動作することですが、先日、デバイスを機内モードにして、アクティビティに入るとダウンロードが開始されますが、インターネット接続がないためダウンロードアイコンが通知バーが消えず、これはユーザー エクスペリエンスにとって悪い動作です。そこで、これを変更して、インターネット接続がある場合にのみファイルをダウンロードする方法を尋ねています。
これはコードです:
if (comprobarFecha()) {
downloadFile(getActivity());
}
String downloadCompleteIntentName = DownloadManager.ACTION_DOWNLOAD_COMPLETE;
IntentFilter downloadCompleteIntentFilter = new IntentFilter(downloadCompleteIntentName);
BroadcastReceiver mDownloadEstablecimientosComplete = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -2);
DownloadManager.Query query = new DownloadManager.Query();
Log.e("QUERY", "broadcast " + String.valueOf(downloadId));
query.setFilterById(downloadId);
Cursor cur = dm.query(query);
if (cur.moveToFirst()) {
int columnIndex = cur.getColumnIndex(DownloadManager.COLUMN_STATUS);
switch (cur.getInt(columnIndex)) {
case DownloadManager.STATUS_SUCCESSFUL:
// Como se ha completado con éxito borramos el archivo antiguo
Log.e(AppConstants.TAG_RECETA, "Descarga realizada con éxito");
File file = context.getExternalFilesDir(null);
String mFileNameNew = file.getPath() + "/" + AppConstants.TAG_RECETAS + "-1";
File establecimientosFileNew = new File(mFileNameNew);
// Existe uno nuevo
if (establecimientosFileNew.exists()) {
Log.e("entro", "existe uno nuevo");
String establecimientosFileOld = file.getPath() + "/" + AppConstants.TAG_RECETAS;
File mFileNameOld = new File(establecimientosFileOld);
if (mFileNameOld.exists()) {
// Borramos el viejo
mFileNameOld.delete();
// Renombramos el nuevo
Log.e("entro", "renombramos el nuevo");
establecimientosFileNew.renameTo(mFileNameOld);
Snackbar.make(mSnackBarView, "Recetas actualizadas", Snackbar.LENGTH_SHORT).show();
}
}
break;
case DownloadManager.STATUS_FAILED:
int columnReasonIndex = cur.getColumnIndex(DownloadManager.COLUMN_REASON);
Log.e(AppConstants.TAG_RECETAS, "Descarga fallida: " + cur.getInt(columnReasonIndex));
break;
}
}
cur.close();
cur = null;
}
};
getActivity().registerReceiver(mDownloadEstablecimientosComplete, downloadCompleteIntentFilter);
public void downloadFile(Context ctx) {
DownloadManager mDownloadManager = (DownloadManager) ctx.getSystemService(Context.DOWNLOAD_SERVICE);
String url_download = url + cod;
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url_download));
// Tipo de archivo
request.setMimeType("application/json");
// Solo descargamos con WIFI
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
// Titulo
request.setTitle("Descarga recetas");
// No será visible en el historial de descargas
request.setVisibleInDownloadsUi(false);
//request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// Guardamos el archivo
request.setDestinationInExternalFilesDir(ctx, null, TAG_RECETAS);
// Guardamos el id para notificación cuando acabe
long quequeId = mDownloadManager.enqueue(request);
Log.e("QUERY", "download " + String.valueOf(mDownloadManager.enqueue(request)));
}
最初にインターネット接続を検出する方法を作成し、ネットワークサービスが期待どおりに機能している場合にのみそれらの方法を起動する場合..しかし、これが機能するはずの方法であるかどうかはわかりません。番組の質問よりも放送受信機がどのように機能するか
つまり、私のソリューションは次のようなものです。
if (isNetworkAvailable()) {
inicializarFecha();
if (comprobarFecha()) {
downloadFile(getActivity());
}
String downloadCompleteIntentName = DownloadManager.ACTION_DOWNLOAD_COMPLETE;
IntentFilter downloadCompleteIntentFilter = new IntentFilter(downloadCompleteIntentName);
BroadcastReceiver mDownloadEstablecimientosComplete = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
....
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
事前にどうもありがとう:)