2011-10-26 19 views
49

Soy un nuevo androide, estoy creando una aplicación en la que uno puede descargar archivos a la carpeta de descargas (usando el Administrador de descargas). Puedo ver fotos si voy a la carpeta de descargas en el emulador. Entonces, si quiero mostrar una presentación de diapositivas de los archivos descargados, ¿cómo puedo obtener el acceso a esa carpeta? En segundo lugar cómo agregar barra de progreso para este código: -cómo acceder a la carpeta de descargas en 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); 
     } 
    } 

Quiero añadir un botón que realiza la función de tomar las imágenes de la carpeta de descargas y luego mostrar como una presentación de diapositivas.

<?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> 

Respuesta

147

Para su primera pregunta tratar

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

(disponible desde el API 8)

para acceder a archivos individuales en este directorio, ya sea uso File.list() o File.listFiles(). Parece que informar el progreso de la descarga solo es posible en la notificación, consulte here.

+0

@ slkorolev- hola gracias, cómo puedo agregar una barra de progreso a este código, ¿pueden ayudarme por favor – Dhruv

+3

y una cosa más, que cuando tenemos acceso a external_downloads por Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS); ¿Cómo acceder más a cada archivo en esa carpeta? – Dhruv

+0

@Drake: edité la respuesta – slkorolev

22

Es necesario configurar este permiso en su archivo manifest.xml

android.permission.WRITE_EXTERNAL_STORAGE 
+1

@Bo Persson: Gracias :) – Dhruv

+2

A partir del nivel API 23 (Marshmallow) también necesita solicitar el permiso en tiempo de ejecución. Consulte [Trabajar con permisos del sistema] (http://developer.android.com/training/permissions/index.html) para obtener más información. –

6

Si está utilizando la melcocha, usted tiene que o bien:

  1. Request permissions en tiempo de ejecución (el usuario recibirá para permitir o denegar la solicitud) o:
  2. El usuario debe ingresar en Configuración -> Aplicaciones -> {Su aplicación} -> Permisos y grant storage access.

Esto se debe a que en Marshmallow, Google renovó por completo cómo funcionan los permisos.

Cuestiones relacionadas