有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我保存了一个学校项目,该项目处理的是一个列表视图,其中包含托管在服务器上的图像
当有人从列表中选择一个图像时,它在另一个布局中以“原始”大小显示,即使在这里,一切都很顺利
但也要询问图像显示器何时可以选择将其保存到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) {

        }
    });
}
}

如果显示的是选定的图像,但不是现在,请单击“下载”按钮以了解如何处理事件中的数据
解决办法是什么


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    首先,您需要获取位图。您可以将其作为对象位图,也可以尝试从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"/>