2011-10-26 20 views
49

Sono un nuovo androide, sto creando un'app in cui è possibile scaricare i file nella cartella dei download (utilizzando Download Manager). Posso vedere le immagini se vado nella cartella dei download in emulatore. Quindi se voglio mostrare una presentazione di file scaricati come posso ottenere l'accesso a quella cartella? In secondo luogo come aggiungere barra di avanzamento per questo codice: -come accedere alla cartella download in Android?

import java.util.Arrays; 

import android.app.Activity; 
import android.app.DownloadManager; 
import android.app.DownloadManager.Query; 
import android.app.DownloadManager.Request; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageView; 

public class Download_managerActivity extends Activity { 
    private long quueue_for_url; 

    private DownloadManager dm; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      BroadcastReceiver receiver = new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 
        String action = intent.getAction(); 

        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
         long downloadId = intent.getLongExtra(
           DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
         Query query = new Query(); 
         query.setFilterById(quueue_for_url); 
         Cursor c = dm.query(query); 
         if (c.moveToFirst()) { 
          int columnIndex = c 
            .getColumnIndex(DownloadManager.COLUMN_STATUS); 
          if (DownloadManager.STATUS_SUCCESSFUL == c 
            .getInt(columnIndex)) { 

           ImageView view = (ImageView) findViewById(R.id.imageView1); 
           String uri_String_abcd = c 
             .getString(c 
               .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 
           view.setImageURI(Uri.parse(uri_String_abcd)); 

          } 
         } 
        } 
       } 
      }; 

      registerReceiver(receiver, new IntentFilter(
        DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 
     } 

     public void onClick(View view) { 
      dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 

      Request request_for_url = new Request(
        Uri.parse("http://fc03.deviantart.net/fs14/i/2007/086/9/1/Steve_Jobs_portrait_by_tumb.jpg")); 

      Request request_for_url1 = new Request(
        Uri.parse("http://2.bp.blogspot.com/_q7Rxg4wqDyc/S5ZRVLxVYuI/AAAAAAAAAvU/fQAUZ2XFcp8/s400/katrina-kaif.jpg")); 
      Request request_for_url2 = new Request(
        Uri.parse("http://www.buzzreactor.com/sites/default/files/Bill-Gates1.jpg")); 

      quueue_for_url = dm.enqueue(request_for_url); 
      quueue_for_url = dm.enqueue(request_for_url1); 
      quueue_for_url = dm.enqueue(request_for_url2); 

     } 

     public void showDownload(View view) { 
      Intent i = new Intent(); 
      //try more options to show downloading , retrieving and complete 
      i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS); 
      startActivity(i); 
     } 
    } 

voglio aggiungere un pulsante che svolge la funzione di prendere le immagini da cartella dei download e quindi visualizzare come una presentazione.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="cmpe235.lab1" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="9" /> 

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".Download_managerActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
</manifest> 

main.xml: -

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 


    <Button android:text="Start Download" android:id="@+id/button1" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical|center_horizontal|center" android:textColor="#0000A0" 
     android:typeface="serif" android:onClick="onClick"></Button> 

    <Button android:text="View Downloads" android:id="@+id/button2" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical|center_horizontal|center" android:textColor="#0000A0" 
     android:typeface="serif" android:onClick="showDownload"></Button> 

    <ImageView android:layout_height="wrap_content" android:id="@+id/imageView1" 
     android:src="@drawable/icon" android:layout_width="wrap_content"></ImageView> 

</LinearLayout> 

risposta

147

Per la vostra prima domanda provare

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

(disponibile dal API 8)

per accedere ai singoli file in questa cartella sia uso File.list() o File.listFiles(). Sembra che la segnalazione dell'avanzamento del download sia possibile solo nella notifica, vedere here.

+0

@ slkorolev- hey grazie, come posso aggiungere barra di avanzamento a questo codice, puoi aiutarmi per favore – Dhruv

+3

e un'altra cosa, che quando avremo accesso a externa_downloads da Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS); come accedere ulteriormente ad ogni file in quella cartella? – Dhruv

+0

@Drake: ho modificato la risposta – slkorolev

22

È necessario impostare questa autorizzazione nel file manifest.xml

android.permission.WRITE_EXTERNAL_STORAGE 
+1

@Bo Persson: Grazie :) – Dhruv

+2

A partire dal livello API 23 (Marshmallow) è inoltre necessario richiedere l'autorizzazione in fase di esecuzione. Vedi [Lavorare con le autorizzazioni di sistema] (http://developer.android.com/training/permissions/index.html) per maggiori informazioni. –

6

Se si utilizza Marshmallow, bisogna o:

  1. Request permissions in fase di esecuzione (l'utente riceverà per consentire o negare la richiesta) oppure:
  2. L'utente deve passare a Impostazioni -> Applicazioni -> {La tua app} -> Autorizzazioni e grant storage access.

Questo perché in Marshmallow, Google ha rinnovato completamente il funzionamento delle autorizzazioni.

Problemi correlati