2016-08-04 3 views
0

Я держу школьный проект, связанный с ListView, заполненный изображениями, размещенными на сервере.
Когда кто-то выбирает изображение из списка, это показано «оригинальным» размером в другом макете, и даже здесь все прошло хорошо.
Но также спросите, когда на экране изображения есть возможность сохранить его на SD-карте, и это та часть, которую я не могу сделать.Android Studio: сохранить изображение на SD-карте

Это код, который я сделал:

public class MainActivity extends AppCompatActivity { 

private ListView listView; 
private ProgressDialog progressDialog; 
ArrayList asuntos=new ArrayList(); 
ArrayList imagen=new ArrayList(); 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolBar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolBar); 
    listView=(ListView) findViewById(R.id.list); 
    progressDialog = new ProgressDialog(this); 
    progressDialog.setCancelable(false); 
    lista o=new lista(); 
    o.obtenerAvisos(); 
} 

public class lista { 

    public void obtenerAvisos() { 

     asuntos.clear(); 
     imagen.clear(); 

     String tag_string_req = "req_data"; 

     progressDialog.setMessage("Conectando..."); 
     showDialog(); 

     StringRequest strReq = new StringRequest(Request.Method.POST, AppURLs.URL, new Response.Listener<String>() { 

      public void onResponse(String response) { 

       hideDialog(); 

       try { 

        JSONArray jsonArray = new JSONArray(response); 

        for (int i = 0; i < jsonArray.length(); i++) { 
         asuntos.add(jsonArray.getJSONObject(i).getString("asunto")); 
         imagen.add(jsonArray.getJSONObject(i).getString("publicacion")); 
        } 

        listView.setAdapter(new ImagenAdaptador(getApplicationContext())); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 

      public void onErrorResponse(VolleyError error) { 

       Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
       hideDialog(); 
      } 
     }) { 

      protected Map<String, String> getParams() { 

       Map<String, String> params = new HashMap<String, String>(); 
       params.put("tag", "data"); 
       return params; 
      } 

     }; 
     AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 
    } 
} 

private void showDialog() { 

    if (!progressDialog.isShowing()) 
     progressDialog.show(); 
} 

private void hideDialog() { 

    if (progressDialog.isShowing()) 
     progressDialog.dismiss(); 
} 

public class ImagenAdaptador extends BaseAdapter { 

    Context ctx; 
    LayoutInflater layoutInflater; 
    SmartImageView smartImageView; 
    TextView tvasunto; 

    public ImagenAdaptador(Context applicationContext) { 

     this.ctx=applicationContext; 
     layoutInflater=(LayoutInflater)ctx.getSystemService(LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return imagen.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 


    public long getItemId(int position) { 
     return position; 
    } 


    public View getView(int position, View convertView, ViewGroup parent) { 

     ViewGroup viewGroup=(ViewGroup) layoutInflater.inflate(R.layout.activity_main_items,null); 
     smartImageView=(SmartImageView)viewGroup.findViewById(R.id.imagen1); 
     tvasunto=(TextView) viewGroup.findViewById(R.id.tvAsunto); 
     final String urlfinal="http://192.168.43.45/InfoTec/publicaciones/"+imagen.get(position).toString(); 
     Rect rect=new Rect(smartImageView.getLeft(), smartImageView.getTop(), smartImageView.getRight(), smartImageView.getBottom()); 
     smartImageView.setImageUrl(urlfinal, rect); 
     tvasunto.setText(asuntos.get(position).toString()); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Intent intent = new Intent(MainActivity.this, Visor.class); 
       intent.putExtra("arg", asuntos.get(position).toString()); 
       intent.putExtra("arg2",imagen.get(position).toString()); 
       startActivity(intent); 
      } 
     }); 
     return viewGroup; 
    } 
} 
} 

Эта часть работы, но этот класс является проблемой:

public class Visor extends AppCompatActivity { 

TextView tvasunto2; 
SmartImageView smartImageView2; 
Button descarga; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_visor); 
    String original=getIntent().getStringExtra("arg"); 
    String imgOriginal=getIntent().getStringExtra("arg2"); 
    tvasunto2=(TextView) findViewById(R.id.tvAsunto2); 
    smartImageView2=(SmartImageView) findViewById(R.id.imagen2); 
    descarga=(Button) this.findViewById(R.id.button); 

    tvasunto2.setText(original); 
    String url="http://192.168.43.45/InfoTec/publicaciones/"+imgOriginal; 
    Rect rect=new Rect(smartImageView2.getLeft(), smartImageView2.getTop(), smartImageView2.getRight(), smartImageView2.getBottom()); 
    smartImageView2.setImageUrl(url,rect); 

    descarga.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     } 
    }); 
} 
} 

Если отображается выбранное изображение, но не сейчас, как обрабатывать данные в случае кнопки загрузки.
Каким будет решение?

ответ

0

Во-первых, вам нужно получить растровое изображение. Вы уже можете иметь его в качестве объекта Bitmap, или вы можете попытаться получить его из ImageView, таких как:

BitmapDrawable drawable = (BitmapDrawable) mImageView1.getDrawable(); 
Bitmap bitmap = drawable.getBitmap(); 

Тогда вы должны попасть в каталог (объект File) с SD-карты, такие как:

File sdCardDirectory = Environment.getExternalStorageDirectory(); 

Далее создайте отдельный файл для хранения изображений:

File image = new File(sdCardDirectory, "test.png"); 

После этого, вы просто должны написать Bitmap благодаря своему методу компресса, такие как:

boolean success = false; 

// Encode the file as a PNG image. 
FileOutputStream outStream; 
try { 

    outStream = new FileOutputStream(image); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
    /* 100 to keep full quality of the image */ 

    outStream.flush(); 
    outStream.close(); 
    success = true; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Наконец, при необходимости обработайте логический результат. Такие, как:

if (success) { 
    Toast.makeText(getApplicationContext(), "Image saved with success", 
      Toast.LENGTH_LONG).show(); 
} else { 
    Toast.makeText(getApplicationContext(), 
      "Error during image saving", Toast.LENGTH_LONG).show(); 
} 

Не забудьте добавить следующее разрешение в манифесте:

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

отлично работает спасибо очень много. Определенно, мне нужно больше узнать о ресурсах, которые используются в Android, я пытался понять другой способ, который не имел ничего общего. – PromptShadow

+0

Добро пожаловать :) – LychmanIT

Смежные вопросы