如何在Android上的ImageView上设置的应用程序上共享图像

时间:2015-07-19 14:30:16

标签: android image imageview

我的代码中有一个在imageview上设置的图像(通过互联网下载)。我通过json得到这个图像。

我想在什么应用上分享这个图片,但我不知道文件名或路径。

我试过这段代码

Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("image/*");
    share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg"));
    startActivity(Intent.createChooser(share,"Share via"));

但是当你看到传递文件路径时,我不知道文件路径和文件名。

无论如何,我可以从ImageView获取图片并通过share.putExtra....分享

因为我可以通过什么应用轻松分享文字。

我特别关注从ImageView方法获取图像,因为它满足我的要求,而不是通过文件路径名获取图像。

我的jsonfetcher

公共类DownloadJSON扩展了AsyncTask {    // private final ProgressDialog progressDialog;

@Override

protected void onPreExecute() {
    super.onPreExecute();
    pd = new ProgressDialog(CanadaJson.this);
    pd.setTitle("Getting the dishes from our Server Cookers");
    pd.setMessage("The waiter is getting the menu...");
    pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    pd.setIndeterminate(true);
    pd.setCancelable(false);
    pd.show();
}
@Override
protected Void doInBackground(Void... params) {

    // Create an array
    arraylist = new ArrayList<HashMap<String, String>>();
    // Retrieve JSON Objects from the given URL

        jsonobject = JSONfunctions.getJSONfromURL("https://lit-hamlet-6856.herokuapp.com/eventsList/TECHNICAL");
    Log.d("Json Code",jsonobject.toString());


    try {
        // Locate the array name in JSON
        jsonarray = jsonobject.getJSONArray("events");

        for (int i = 0; i < jsonarray.length(); i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            jsonobject = jsonarray.getJSONObject(i);
            // Retrive JSON Objects
            map.put("Name", jsonobject.getString("Name"));
            map.put("Time", jsonobject.getString("Time"));
            map.put("Serves", jsonobject.getString("Serves"));
            map.put("ingredients", jsonobject.getString("ingredients"));
            map.put("Description",jsonobject.getString("Description"));
            // Set the JSON Objects into the array
            arraylist.add(map);
        }

    } catch (JSONException e) {
        Log.e("Error", e.getMessage());

        e.printStackTrace();
    }
    return null;

}
@Override
protected void onPostExecute(Void args) {
    // Locate the listview in listview_main.xml
    //setContentView(R.layout.listview_main);
    listview = (ListView) findViewById(R.id.listview);
    // Pass the results into ListViewAdapter.java
    adapter = new ListViewAdapter(CanadaJson.this, arraylist);
    // Set the adapter to the ListView
    listview.setAdapter(adapter);
    // Close the progressdialog
    pd.dismiss();

 //   textView.setVisibility(View.VISIBLE);

   // mProgressDialog.dismiss();
    super.onPostExecute(args);


}

}

然后我就是这样做的。

imageLoader.DisplayImage(resultp.get(FirstActivity.ingredients), flag);

ImageLoader类(我如何下载图像的方法)

public class ImageLoader {

    MemoryCache memoryCache = new MemoryCache();
    FileCache fileCache;
    private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
    ExecutorService executorService;
    // Handler to display images in UI thread
    Handler handler = new Handler();

    public ImageLoader(Context context) {
        fileCache = new FileCache(context);
        executorService = Executors.newFixedThreadPool(5);
    }

    final int stub_id = R.drawable.icon;

    public void DisplayImage(String url, ImageView imageView) {
        imageViews.put(imageView, url);
        Bitmap bitmap = memoryCache.get(url);
        if (bitmap != null)
            imageView.setImageBitmap(bitmap);
        else {
            queuePhoto(url, imageView);
            imageView.setImageResource(stub_id);
        }
    }

    private void queuePhoto(String url, ImageView imageView) {
        PhotoToLoad p = new PhotoToLoad(url, imageView);
        executorService.submit(new PhotosLoader(p));
    }

    private Bitmap getBitmap(String url) {
        File f = fileCache.getFile(url);

        Bitmap b = decodeFile(f);
        if (b != null)
            return b;

        // Download Images from the Internet
        try {
            Bitmap bitmap = null;
            URL imageUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
            conn.setConnectTimeout(30000);
            conn.setReadTimeout(30000);
            conn.setInstanceFollowRedirects(true);
            InputStream is = conn.getInputStream();
            OutputStream os = new FileOutputStream(f);
            Utils.CopyStream(is, os);
            os.close();
            conn.disconnect();
            bitmap = decodeFile(f);
            return bitmap;
        } catch (Throwable ex) {
            ex.printStackTrace();
            if (ex instanceof OutOfMemoryError)
                memoryCache.clear();
            return null;
        }
    }

    // Decodes image and scales it to reduce memory consumption
    private Bitmap decodeFile(File f) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            FileInputStream stream1 = new FileInputStream(f);
            BitmapFactory.decodeStream(stream1, null, o);
            stream1.close();

            // Find the correct scale value. It should be the power of 2.
            // Recommended Size 512
            final int REQUIRED_SIZE = 256;//control quality of images
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 1;
            while (true) {
                if (width_tmp / 2 < REQUIRED_SIZE
                        || height_tmp / 2 < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale *= 2;
            }

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            FileInputStream stream2 = new FileInputStream(f);
            Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
            stream2.close();
            return bitmap;
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    // Task for the queue
    private class PhotoToLoad {
        public String url;
        public ImageView imageView;

        public PhotoToLoad(String u, ImageView i) {
            url = u;
            imageView = i;
        }
    }

    class PhotosLoader implements Runnable {
        PhotoToLoad photoToLoad;

        PhotosLoader(PhotoToLoad photoToLoad) {
            this.photoToLoad = photoToLoad;
        }

        @Override
        public void run() {
            try {
                if (imageViewReused(photoToLoad))
                    return;
                Bitmap bmp = getBitmap(photoToLoad.url);
                memoryCache.put(photoToLoad.url, bmp);
                if (imageViewReused(photoToLoad))
                    return;
                BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
                handler.post(bd);
            } catch (Throwable th) {
                th.printStackTrace();
            }
        }
    }

    boolean imageViewReused(PhotoToLoad photoToLoad) {
        String tag = imageViews.get(photoToLoad.imageView);
        if (tag == null || !tag.equals(photoToLoad.url))
            return true;
        return false;
    }

    // Used to display bitmap in the UI thread
    class BitmapDisplayer implements Runnable {
        Bitmap bitmap;
        PhotoToLoad photoToLoad;

        public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
            bitmap = b;
            photoToLoad = p;
        }

        public void run() {
            if (imageViewReused(photoToLoad))
                return;
            if (bitmap != null)
                photoToLoad.imageView.setImageBitmap(bitmap);
            else
                photoToLoad.imageView.setImageResource(stub_id);
        }
    }

    public void clearCache() {
        memoryCache.clear();
        fileCache.clear();
    }

}

2 个答案:

答案 0 :(得分:0)

通过将图像的本地副本保存到SD卡,然后再将其分配给ImageView,您可以共享它。

关于用于将图像从JSON设置为ImageView的代码,您是否会更加冗长?

[如果提供了数据,我将编辑此答案。]

答案 1 :(得分:0)

好的,所以经过大量的点击和试用以及谷歌搜索后我发现了一个解决方案,但事实证明我必须保存图像,这是最好的程序,但我的这个答案将消除命名的麻烦,你只需要提供一个默认名称。

try-catch

会有很多尝试和捕获语句。

默认的共享类型是什么应用