2017-04-20 2 views
-2

私はユーザーが壁紙をダウンロードしたりデスクトップに直接保存できるアプリケーションを構築しています。アンドロイドにダウンロードカウンタ(ダウンロード数)を追加するにはどうすればよいですか?

私が今やりたいのは、ダウンロードカウンタまたはダウンロード数をTextviewに追加して、その特定のイメージのダウンロード総数を表示することです。言い換えれば、特定の画像が他のユーザによってダウンロードされた回数。

私はそれを行う方法がわかりません、私はGoogleアナリティクスを使用することができますが、ライブラリやサービスを使用することなくそれを行う方法はありますか?

+1

変数をローカルに保存できないのはなぜですか? – creativecreatorormaybenot

+0

ローカル変数は、すべてのユーザーに画像がダウンロードされた回数を表示させたいので機能しません。 –

+0

私はあなたの質問を理解したと思います。だから、明確にするために、あなたはどこにイメージをサーバーに保存していますか、ユーザーはどのようにそれらのイメージのURLを取得していますか? –

答えて

0

これはかなり簡単な作業ですが、サーバー側とデバイス側でいくつかの変更を加えなければなりません。サーバー側で

変更:
1.などIMAGE_URL、イメージ名、image_idは、のような画像の詳細情報を記録するためのテーブルでデシベルを追加(正当な主キーを持っていることを確認してください)、最も重要なもの、ダウンロード数を追加してください。
2.画像の詳細を取得するためにサーバーを呼び出すAPIで、ダウンロード数の別のパラメータを追加します。
3.別のエンドポイントを作成して、ダウンロードの成功を更新します。デバイス側の

変更:
1.ダウンロードが成功すると、そのサーバーがデータベースにダウンロード数を更新しますので、あなたの新しいAPIへの呼び出しを行います。
2.ここで興味深い部分があります。ダウンロードが成功した場合は、textviewに、サーバーから以前に受け取ったダウンロード数を増やす必要があります。
3.ダウンロード回数を動的にする場合、つまり、画像をダウンロードするたびにダウンロード数を更新する場合は、Firebase Dynamic DBを使用できます。

手順FirebaseダイナミックDB
1. FirebaseダイナミックDBを無償で使用すると、あなたがこれを使用している場合、あなたは文句を言わない、私は上記の手順で述べたように、サーバーに任意のDBを追加する必要があります。
3. Firebase DBは実装するのが少し複雑ですので、スキーマを設計するための適切な時間を費やしてください。
4. Firebase DBには、アクセス権のあるクライアントがDB内の値を更新できる機能があり、この更新はDB上のリスナーを持つ他のクライアントに自動的に通知されます。この機能を使用すると、サーバコールを何度も繰り返すことなく、最新のダウンロード数を取得できます。
5.最も重要なステップ、ダウンロードが成功したら、すべてのクライアントはあなたがTextView

を更新するために使用することができ、最新の値で通知を受けるように、私はあなたがすることをお勧めFirebaseダイナミックDBを更新Firebase DBは高速で、サーバー上で追加の作業を行う必要はありません()。将来、アプリケーションにプッシュ通知を追加する場合は、同じFirebaseプロジェクトを使用してプッシュ通知を追加することもできます。

+0

ありがとうございました@MohammedAtif。 –

+0

@SohamChaudhariこのメソッドを試してみてください。それが正しいとマークしてください –

0
  1. 静的整数変数を作成します。
  2. ダウンロード開始ごとにカウンタを増やす
  3. ダウンロードまたはエラーの終了ごとにカウンタを減らしてください。

したがって、カウンターはあなたに正確な進行中のイメージのダウンロードを提供します。

0

この方法では、いくつかのバックグラウンドプロセスを実行し、同時にUIを更新することができます(この場合は、進行状況バーを更新します)。

これはサンプルコードです:

//あなたの活動のメンバーフィールドとしてダイアログを宣言

ProgressDialog mProgressDialog; 

// instantiate it within the onCreate method 
mProgressDialog = new ProgressDialog(YourActivity.this); 
mProgressDialog.setMessage("A message"); 
mProgressDialog.setIndeterminate(true); 
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
mProgressDialog.setCancelable(true); 

//ダウンローダは 最終DownloadTask downloadTask =新しいDownloadTaskを解雇しなければならないときにこれを実行します(YourActivity.this); downloadTask.execute( "ダウンロードしたいファイルへのURL");

mProgressDialog.setOnCancelListener(新しいDialogInterface.OnCancelListener(){ @Override公共ボイドonCancel(DialogInterfaceダイアログ){ downloadTask.cancel(TRUE); }})。 AsyncTaskは次のようになります。

//通常、AsyncTaskのサブクラスはアクティビティクラス内で宣言されます。 //そのように、あなたは簡単にここ プライベートクラスDownloadTaskからUIスレッドがAsyncTask {

private Context context; 
    private PowerManager.WakeLock mWakeLock; 

    public DownloadTask(Context context) { 
     this.context = context; 
    } 

    @Override 
    protected String doInBackground(String... sUrl) { 
     InputStream input = null; 
     OutputStream output = null; 
     HttpURLConnection connection = null; 
     try { 
      URL url = new URL(sUrl[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 

      // expect HTTP 200 OK, so we don't mistakenly save error report 
      // instead of the file 
      if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { 
       return "Server returned HTTP " + connection.getResponseCode() 
         + " " + connection.getResponseMessage(); 
      } 

      // this will be useful to display download percentage 
      // might be -1: server did not report the length 
      int fileLength = connection.getContentLength(); 

      // download the file 
      input = connection.getInputStream(); 
      output = new FileOutputStream("/sdcard/file_name.extension"); 

      byte data[] = new byte[4096]; 
      long total = 0; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       // allow canceling with back button 
       if (isCancelled()) { 
        input.close(); 
        return null; 
       } 
       total += count; 
       // publishing the progress.... 
       if (fileLength > 0) // only if total length is known 
        publishProgress((int) (total * 100/fileLength)); 
       output.write(data, 0, count); 
      } 
     } catch (Exception e) { 
      return e.toString(); 
     } finally { 
      try { 
       if (output != null) 
        output.close(); 
       if (input != null) 
        input.close(); 
      } catch (IOException ignored) { 
      } 

      if (connection != null) 
       connection.disconnect(); 
     } 
     return null; 
    } 

(doInBackground)上記の方法を拡張して変更することができますバックグラウンドスレッドで常に動作します。そこにはUIタスクを実行すべきではありません。一方、onProgressUpdateとonPreExecuteは、UIスレッド上で実行するので、そこには、プログレスバーを変更できます。このため

@Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // take CPU lock to prevent CPU from going off if the user 
     // presses the power button during download 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
      getClass().getName()); 
     mWakeLock.acquire(); 
     mProgressDialog.show(); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     super.onProgressUpdate(progress); 
     // if we get here, length is known, now set indeterminate to false 
     mProgressDialog.setIndeterminate(false); 
     mProgressDialog.setMax(100); 
     mProgressDialog.setProgress(progress[0]); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     mWakeLock.release(); 
     mProgressDialog.dismiss(); 
     if (result != null) 
      Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show(); 
     else 
      Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show(); 
    } 

を実行するには、WAKE_LOCK権限が必要です。

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+0

を達成するための、安全で信頼性が高くスケーラブルな方法です、素晴らしいです。彼はカウントを得る方法を知りたいだけです。 –

+0

まもなく@MohammedAtif彼らはダウンロードの進捗状況を表示する方法に答えています! –

関連する問題