0

I have created an android application for showing online images in a gridview. The application is working fine and the images are showing within the GridView. The problem is that I want to show the image in a default image viewer when we click a particular image in a GridView.

can ayone please tell me some suggestions for this

My code is as given below

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        setContentView(R.layout.activity_main);

        GridView gridview = (GridView) findViewById(R.id.gridView1);
        gridview.setAdapter(new ImageAdapter(this));

        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                Intent mInDisplay = new Intent(MainActivity.this, MainActivity.class);
                // how to show the selected image in default image viewer
            }
        });
    }

    public class ImageAdapter extends BaseAdapter {
        /** The parent context */
        private Context myContext;

        /** URL-Strings to some remote images. */
        private String[] myRemoteImages = {
                "http://www.example.com/uploads/gallery/sample1.jpg",
                "http://www.example.com//uploads/gallery/sample2.jpg",
                "http://www.example.com//uploads/gallery/sample3.jpg",
                "http://www.example.com//uploads/gallery/sample4.jpg",
                "http://www.example.com//uploads/gallery/sample5.jpg",
                "http://www.example.com//uploads/gallery/sample6.jpg",
                "http://www.example.com//uploads/gallery/sample7.jpg",
                "http://www.example.com//uploads/gallery/sample8.jpg",
                "http://www.example.com//uploads/gallery/sample9.jpg" };

        /** Simple Constructor saving the 'parent' context. */
        public ImageAdapter(Context c) {
            this.myContext = c;
        }

        /** Returns the amount of images we have defined. */
        public int getCount() {
            return this.myRemoteImages.length;
        }

        /* Use the array-Positions as unique IDs */
        public Object getItem(int position) {
            return position;
        }

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

        /**
         * Returns a new ImageView to be displayed, depending on the position
         * passed.
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(this.myContext);

            try {
                /* Open a new URL and get the InputStream to load data from it. */
                URL aURL = new URL(myRemoteImages[position]);
                URLConnection conn = aURL.openConnection();
                conn.connect();
                InputStream is = conn.getInputStream();
                /* Buffered is always good for a performance plus. */
                BufferedInputStream bis = new BufferedInputStream(is);
                /* Decode url-data to a bitmap. */
                Bitmap bm = BitmapFactory.decodeStream(bis);
                bis.close();
                is.close();
                /* Apply the Bitmap to the ImageView that will be returned. */
                i.setImageBitmap(bm);
            } catch (IOException e) {
                i.setImageResource(R.drawable.ic_launcher);
                Log.e("DEBUGTAG", "Remtoe Image Exception", e);
            }

            /* Image should be scaled as width/height are set. */
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            /* Set the Width/Height of the ImageView. */
            i.setLayoutParams(new GridView.LayoutParams(150, 150));
            return i;
        }

        /**
         * Returns the size (0.0f to 1.0f) of the views depending on the
         * 'offset' to the center.
         */
        public float getScale(boolean focused, int offset) {
            /* Formula: 1 / (2 ^ offset) */
            return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));
        }
    }
}
Alex Man
  • 4,746
  • 17
  • 93
  • 178

1 Answers1

1

To show your image by a default image viewer, you need the image to be stored in your device.

So i suggest you to save your image locally (maybe temporary) and then open an intent with ACTION_VIEW.

To save the bitmap (source):

    private String saveToInternalSorage(Bitmap bitmapImage){
            ContextWrapper cw = new ContextWrapper(getApplicationContext());
             // path to /data/data/yourapp/app_data/imageDir
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            // Create imageDir
            File mypath=new File(directory,"profile.jpg");

            FileOutputStream fos = null;
            try {           

                fos = new FileOutputStream(mypath);

           // Use the compress method on the BitMap object to write image to the OutputStream
                bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return directory.getAbsolutePath();
    }

To view your image:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("thePathReturnedFromPreviousMethod"), "image/*");
startActivity(intent);
Community
  • 1
  • 1
Rami
  • 7,879
  • 12
  • 36
  • 66
  • @Rani thanks for the answer, the problem was that I am having n number of images may be 100 and 1000 , so saving all those under click is not a best way, do we have any other option, I plan to use default image viewer so that we can zoom in and out since most of the images are big size. – Alex Man Oct 25 '15 at 00:42
  • I don't think there is another solution, if you want to use the default image viewer. But you dont need to save all the images, you can use some cache mechanism. eg: save the visible images +(next and previous) 5, then in your adapter you save/remove images with asynctask. – Rami Oct 25 '15 at 00:57
  • [Here](http://www.technotalkative.com/android-load-images-from-web-and-caching/) is an example, you can get inspired with. – Rami Oct 25 '15 at 07:39