Java Android Studio:将图像保存在SD卡中

Java Android Studio:将图像保存在SD卡中,java,android,Java,Android,我保存了一个学校项目,该项目处理的是一个包含托管在服务器上的图像的列表视图。 当有人从列表中选择一幅图像时,它会在另一个布局中以“原始”大小显示,即使在这里,一切都很顺利。 但也要询问图像显示器何时可以选择将其保存到SD卡,这是我不能做的部分 这是我做的代码: public class MainActivity extends AppCompatActivity { private ListView listView; private ProgressDialog progressDialog

我保存了一个学校项目,该项目处理的是一个包含托管在服务器上的图像的列表视图。
当有人从列表中选择一幅图像时,它会在另一个布局中以“原始”大小显示,即使在这里,一切都很顺利。
但也要询问图像显示器何时可以选择将其保存到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;
    }
}
}
如果显示所选图像,但不是现在,则在事件中如何处理数据,请单击下载按钮。

解决方案是什么?

首先,您需要获取位图。您可以将其作为对象位图,也可以尝试从ImageView获取,例如:

BitmapDrawable drawable = (BitmapDrawable) mImageView1.getDrawable();
Bitmap bitmap = drawable.getBitmap();
然后,您必须从SD卡访问目录(文件对象),例如:

File sdCardDirectory = Environment.getExternalStorageDirectory();
接下来,创建用于图像存储的特定文件:

File image = new File(sdCardDirectory, "test.png");
之后,由于位图的压缩方法,您只需编写位图,例如:

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"/>


最好创建一个对话框,让用户选择照片的存储位置。请记住,安卓设备有很多种,它们可能会有所不同。

非常好用,非常感谢。当然,我必须阅读更多关于Android中使用的资源的信息,我试图找到另一种与之无关的方式。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>