[APP] SendReduced -- email reduced size photos

Search This thread

arpruss

Senior Member
Jul 3, 2010
909
434
pruss.mobi
Links:
Free version in Google Play
Pro version in Google Play

There are already a bunch of apps in Google Play for reducing the size of photos for emailing. The one that I tried required many extra taps: select share, then select the app, then choose the reduce, then choose a resolution, then select share again. And it didn't respect photo orientations. Plus it had ads. I wanted something that doesn't require any extra taps over and beyond normal emailing. Plus something simple, small (35K!), and with no ads in ordinary use (the Options do have a link to the Pro version, but the Options doesn't show up in normal use, only when you want to customize the resolution).

There is source code (BSD license). It's very simple. From Gallery or Camera, when sharing a photo, just choose "Send Reduced" and it'll send it reduced to a size that fits in a 1024x1024 square (you can run SendReduced from your launcher to adjust this resolution). The first time you run it, you'll need to select which email app to use. There should be a checkmark to make this setting permanent, so that next time you just choose "Send Reduced" when sharing a photo it should just go straight through to your email app, and so it won't take any more taps than just sharing a photo normally.

You can also use SendReduced to attach a reduced photo. Just choose "Get Reduced Photo" when attaching (I only tested in gmail). Then choose Gallery as your picker, and set the checkmark so next time you won't be asked.

The Pro version lets you include some EXIF data and control the filenames of the reduced version. Try the free version before buying the pro, or just keep using the free version (or build the pro version from source, if fancy so takes you).

Needs Android 2.0.
 
Last edited:

arpruss

Senior Member
Jul 3, 2010
909
434
pruss.mobi
Sounds handy. Downloading it now :)

*EDIT*: Crashes on my Galaxy S III (Stock Android 4.1.2) :(

1. How did you invoke it? Were in you in Gallery and did you press Share, or were you in an email app and chose Attach?
2. Any chance of sending me a log? If your device is rooted, you can get catlog from Google Play and send me (arpruss at gmail dot com) a log right after the crash.
 

curl66

Senior Member
Sep 20, 2010
157
19
Great! Thanks! Works fine on CM10 on i9000 :D

Sent from my GT-I9000 using xda app-developers app
 

arpruss

Senior Member
Jul 3, 2010
909
434
pruss.mobi
Just posted 0.04 which cleans up the cache every two days (only if you use SendReduced--I don't want to set up another background alarm!).
 

baal77

New member
Dec 9, 2012
1
0
MAIZIERES LES METZ
And uploaded to Google Play.

The perfect app I was looking for. Now in my Xperia S !!
Two requests for next versions if possible :
- Possible to keep the EXIF infos of the original picture ?
- Possible to keep the filname of the orginal picture followed by a suffix ("IMG5418-small.jpg" for exemple) ?

For the rest... easier than your app is impossible.
Thank you.

Fred.
 

un4seen

Senior Member
Jan 26, 2009
118
11
I like it, simple and effective.
If you take suggestions, it would be awesome if the intent worked for MMS. My operator limits multimedia messages to 300kB (as do many european operators), so sending a picture is impossible in a hurry, and this thing would be very handy every time I have to send a picture to someone without mobile email access.
 

Saketme

Senior Member
Nov 2, 2010
78
8
Ranchi
techsplurge.com
Hi really sorry for not replying. The app now works perfectly on my Galaxy S3 (Android 4.1.2) as well as Nexus 4 (Android 4.2.1). The app is perfect and works as advertised. But there's a *smaaalll* thing that needs to be improved — it's just too simple.

For new users, how are they going to know the procedure to resize images? Some people might try to search for an open image button in your app. Let them know that they need to share an image with SendReduced.

Also, after resizing is complete, SendReduced should offer various apps to share the photo with instead of asking for the default app to open it. I might not always use the same app to share the resized image, right?

Overall, great work! I was searching for an app like this. Please do the changes and I'll be more than happy to cover it in my blog :)
 

Publiuss

Senior Member
Jun 29, 2012
948
171
Hi

Very interesting app... but I've immediate force closes at launch if SD unmounted (mounted on PC).
Pehaps you cold better handle this case.
I'm on sonyericsson SK17i.

Some logs:

Code:
12-10 11:39:36.908 I/ActivityManager(1533): Start proc mobi.omegacentauri.SendReduced for activity mobi.omegacentauri.SendReduced/.Options: pid=11893 uid=10397 gids={1015}
12-10 11:39:36.957 W/InputManagerService(1533): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@2c3f61a8
12-10 11:39:37.437 E/AndroidRuntime(11893): FATAL EXCEPTION: main
12-10 11:39:37.437 E/AndroidRuntime(11893): java.lang.RuntimeException: Unable to start activity ComponentInfo{mobi.omegacentauri.SendReduced/mobi.omegacentauri.SendReduced.Options}: java.lang.NullPointerException
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.app.ActivityThread.access$600(ActivityThread.java:127)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.os.Looper.loop(Looper.java:137)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.app.ActivityThread.main(ActivityThread.java:4441)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at java.lang.reflect.Method.invoke(Method.java:511)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at dalvik.system.NativeStart.main(Native Method)
12-10 11:39:37.437 E/AndroidRuntime(11893): Caused by: java.lang.NullPointerException
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at mobi.omegacentauri.SendReduced.Utils.getCacheDir(Utils.java:60)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at mobi.omegacentauri.SendReduced.Utils.cleanCache(Utils.java:88)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at mobi.omegacentauri.SendReduced.Options.onCreate(Options.java:15)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.app.Activity.performCreate(Activity.java:4465)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
12-10 11:39:37.437 E/AndroidRuntime(11893): 	... 11 more
12-10 11:39:37.447 W/ActivityManager(1533):   Force finishing activity mobi.omegacentauri.SendReduced/.Options
12-10 11:39:37.457 W/ActivityManager(1533):   Force finishing activity com.android.vending/.AssetBrowserActivity
12-10 11:39:37.957 W/ActivityManager(1533): Activity pause timeout for ActivityRecord{2c744da8 mobi.omegacentauri.SendReduced/.Options}
12-10 11:39:39.167 I/ActivityManager(1533): Process mobi.omegacentauri.SendReduced (pid 11893) has died.
12-10 11:39:48.707 W/ActivityManager(1533): Activity destroy timeout for ActivityRecord{2c744da8 mobi.omegacentauri.SendReduced/.Options}
12-10 11:40:13.407 I/ActivityManager(1533): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=mobi.omegacentauri.SendReduced/.Options bnds=[320,102][423,173]} from pid 5824
12-10 11:40:13.607 I/ActivityManager(1533): Start proc mobi.omegacentauri.SendReduced for activity mobi.omegacentauri.SendReduced/.Options: pid=11911 uid=10397 gids={1015}
12-10 11:40:13.878 E/AndroidRuntime(11911): FATAL EXCEPTION: main
12-10 11:40:13.878 E/AndroidRuntime(11911): java.lang.RuntimeException: Unable to start activity ComponentInfo{mobi.omegacentauri.SendReduced/mobi.omegacentauri.SendReduced.Options}: java.lang.NullPointerException
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.app.ActivityThread.access$600(ActivityThread.java:127)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.os.Looper.loop(Looper.java:137)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.app.ActivityThread.main(ActivityThread.java:4441)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at java.lang.reflect.Method.invoke(Method.java:511)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at dalvik.system.NativeStart.main(Native Method)
12-10 11:40:13.878 E/AndroidRuntime(11911): Caused by: java.lang.NullPointerException
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at mobi.omegacentauri.SendReduced.Utils.getCacheDir(Utils.java:60)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at mobi.omegacentauri.SendReduced.Utils.cleanCache(Utils.java:88)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at mobi.omegacentauri.SendReduced.Options.onCreate(Options.java:15)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.app.Activity.performCreate(Activity.java:4465)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
12-10 11:40:13.878 E/AndroidRuntime(11911): 	... 11 more
12-10 11:40:13.878 W/ActivityManager(1533):   Force finishing activity mobi.omegacentauri.SendReduced/.Options
12-10 11:40:14.397 W/ActivityManager(1533): Activity pause timeout for ActivityRecord{2c0a2f98 mobi.omegacentauri.SendReduced/.Options}
12-10 11:40:15.707 I/ActivityManager(1533): START {act=android.intent.action.APP_ERROR flg=0x10000000 cmp=com.android.vending/com.google.android.finsky.activities.AppCrashProxy (has extras)} from pid 1533
12-10 11:40:15.757 I/ActivityManager(1533): START {act=android.intent.action.APP_ERROR flg=0x10000000 pkg=com.google.android.feedback cmp=com.google.android.feedback/.FeedbackActivity (has extras)} from pid 10901
12-10 11:40:15.757 W/InputManagerService(1533): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@2c4cbfc0
12-10 11:40:15.787 I/ActivityManager(1533): Process mobi.omegacentauri.SendReduced (pid 11911) has died.

And

Code:
12-10 11:42:27.337 I/ActivityManager(1533): Start proc mobi.omegacentauri.SendReduced for activity mobi.omegacentauri.SendReduced/.Options: pid=12023 uid=10397 gids={1015}
12-10 11:42:27.348 D/statusbar(9693): read: I/ActivityManager( 1533): Start proc mobi.omegacentauri.SendReduced for activity mobi.omegacentauri.SendReduced/.Options: pid=12023 uid=10397 gids={1015}
12-10 11:42:27.387 I/dalvikvm(12023): Turning on JNI app bug workarounds for target SDK version 4...
12-10 11:42:27.427 W/ResourceType(1533): Skipping entry 0x7f040032 in package table 0 because it is not complex!
12-10 11:42:27.597 D/SurfaceFlinger(134): Release buffer at 0xc22c0
12-10 11:42:27.657 W/Resources(12023): Converting to string: TypedValue{t=0x10/d=0x400 a=-1}
12-10 11:42:27.677 W/Resources(12023): Converting to string: TypedValue{t=0x10/d=0x55 a=-1}
12-10 11:42:27.677 W/ApplicationContext(12023): Unable to create external cache directory
12-10 11:42:27.687 D/AndroidRuntime(12023): Shutting down VM
12-10 11:42:27.697 W/dalvikvm(12023): threadid=1: thread exiting with uncaught exception (group=0x2b542210)
12-10 11:42:27.697 E/AndroidRuntime(12023): FATAL EXCEPTION: main
12-10 11:42:27.697 E/AndroidRuntime(12023): java.lang.RuntimeException: Unable to start activity ComponentInfo{mobi.omegacentauri.SendReduced/mobi.omegacentauri.SendReduced.Options}: java.lang.NullPointerException
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.app.ActivityThread.access$600(ActivityThread.java:127)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.os.Looper.loop(Looper.java:137)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.app.ActivityThread.main(ActivityThread.java:4441)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at java.lang.reflect.Method.invoke(Method.java:511)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at dalvik.system.NativeStart.main(Native Method)
12-10 11:42:27.697 E/AndroidRuntime(12023): Caused by: java.lang.NullPointerException
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at mobi.omegacentauri.SendReduced.Utils.getCacheDir(Utils.java:60)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at mobi.omegacentauri.SendReduced.Utils.cleanCache(Utils.java:88)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at mobi.omegacentauri.SendReduced.Options.onCreate(Options.java:15)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.app.Activity.performCreate(Activity.java:4465)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
12-10 11:42:27.697 E/AndroidRuntime(12023): 	... 11 more
12-10 11:42:27.707 D/statusbar(9693): read: W/ActivityManager( 1533):   Force finishing activity mobi.omegacentauri.SendReduced/.Options
12-10 11:42:27.707 W/ActivityManager(1533):   Force finishing activity mobi.omegacentauri.SendReduced/.Options
12-10 11:42:28.217 W/ActivityManager(1533): Activity pause timeout for ActivityRecord{2c81d9b0 mobi.omegacentauri.SendReduced/.Options}
12-10 11:42:28.227 D/statusbar(9693): adding mock
12-10 11:42:28.237 D/statusbar(9693): read: W/ActivityManager( 1533): Activity pause timeout for ActivityRecord{2c81d9b0 mobi.omegacentauri.SendReduced/.Options}
12-10 11:42:29.248 D/statusbar(9693): adding mock
12-10 11:42:29.248 D/statusbar(9693): Exception when adding mock
12-10 11:42:29.248 W/System.err(9693): java.lang.IllegalStateException: View android.widget.LinearLayout@2bb88de0 has already been added to the window manager.
12-10 11:42:29.257 W/System.err(9693): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:244)
12-10 11:42:29.257 W/System.err(9693): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
12-10 11:42:29.257 W/System.err(9693): 	at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
12-10 11:42:29.257 W/System.err(9693): 	at com.kiumiu.ca.statusbar.free.statusBarService.d(Unknown Source)
12-10 11:42:29.257 W/System.err(9693): 	at com.kiumiu.ca.statusbar.free.r.handleMessage(Unknown Source)
12-10 11:42:29.257 W/System.err(9693): 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-10 11:42:29.257 W/System.err(9693): 	at android.os.Looper.loop(Looper.java:137)
12-10 11:42:29.257 W/System.err(9693): 	at android.app.ActivityThread.main(ActivityThread.java:4441)
12-10 11:42:29.257 W/System.err(9693): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-10 11:42:29.257 W/System.err(9693): 	at java.lang.reflect.Method.invoke(Method.java:511)
12-10 11:42:29.257 W/System.err(9693): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-10 11:42:29.257 W/System.err(9693): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-10 11:42:29.257 W/System.err(9693): 	at dalvik.system.NativeStart.main(Native Method)
12-10 11:42:29.548 I/ActivityManager(1533): START {act=android.intent.action.APP_ERROR flg=0x10000000 cmp=com.android.vending/com.google.android.finsky.activities.AppCrashProxy (has extras)} from pid 1533
12-10 11:42:29.557 I/AudioHardwareMSM7X30(152): Routing audio to Speakerphone
12-10 11:42:29.557 D/statusbar(9693): read: I/ActivityManager( 1533): START {act=android.intent.action.APP_ERROR flg=0x10000000 cmp=com.android.vending/com.google.android.finsky.activities.AppCrashProxy (has extras)} from pid 1533
12-10 11:42:29.567 I/Process (12023): Sending signal. PID: 12023 SIG: 9
12-10 11:42:29.587 D/statusbar(9693): read: I/ActivityManager( 1533): Start proc com.android.vending for activity com.android.vending/com.google.android.finsky.activities.AppCrashProxy: pid=12037 uid=10094 gids={3003, 1015}
12-10 11:42:29.587 I/ActivityManager(1533): Start proc com.android.vending for activity com.android.vending/com.google.android.finsky.activities.AppCrashProxy: pid=12037 uid=10094 gids={3003, 1015}
12-10 11:42:29.587 I/ActivityManager(1533): Process mobi.omegacentauri.SendReduced (pid 12023) has died.

Bye.
 
Last edited:

arpruss

Senior Member
Jul 3, 2010
909
434
pruss.mobi
For new users, how are they going to know the procedure to resize images? Some people might try to search for an open image button in your app. Let them know that they need to share an image with SendReduced.

Well, they can read the Google Play description. :)

Also, after resizing is complete, SendReduced should offer various apps to share the photo with instead of asking for the default app to open it. I might not always use the same app to share the resized image, right?

Actually, I wrote SendReduced for myself in part to remove the need for the extra tap to select an app to share with.

But if you do want to share with different apps at different times, just don't check the checkmark for setting a default app.


By the way, the version in Google Play should clean up the cache when you share or when you run the app (it will delete all entries that have been in the cache two days or more; I don't want to delete newer things, because maybe you're traveling and reception is bad and the email app still hasn't managed to send your picture).
 

berainxda

New member
Feb 22, 2013
2
0
Reduce multiple selected images

arpuss,

Thanks for releasing this brilliant app. I love how it does its job nicely and silently and just gets out of the way.

However, I noticed that this app only works against one image at a time. Have you considered allowing this app to work against multiple selected images? At least on the "send reduced" side. Perhaps the "get reduced" side it makes sense to keep it to a single image. The use case I'm thinking of is selecting 2 or 3 images from the gallery and sending to someone via gmail app. Instead of this being seamless and easy it takes multiple separate "get reduced" actions to do this currently.

Anyway, not complaining but think this would be a great add. May look at this myself but not really familiar with Java or Android development.
 

Top Liked Posts

  • There are no posts matching your filters.
  • 7
    Links:
    Free version in Google Play
    Pro version in Google Play

    There are already a bunch of apps in Google Play for reducing the size of photos for emailing. The one that I tried required many extra taps: select share, then select the app, then choose the reduce, then choose a resolution, then select share again. And it didn't respect photo orientations. Plus it had ads. I wanted something that doesn't require any extra taps over and beyond normal emailing. Plus something simple, small (35K!), and with no ads in ordinary use (the Options do have a link to the Pro version, but the Options doesn't show up in normal use, only when you want to customize the resolution).

    There is source code (BSD license). It's very simple. From Gallery or Camera, when sharing a photo, just choose "Send Reduced" and it'll send it reduced to a size that fits in a 1024x1024 square (you can run SendReduced from your launcher to adjust this resolution). The first time you run it, you'll need to select which email app to use. There should be a checkmark to make this setting permanent, so that next time you just choose "Send Reduced" when sharing a photo it should just go straight through to your email app, and so it won't take any more taps than just sharing a photo normally.

    You can also use SendReduced to attach a reduced photo. Just choose "Get Reduced Photo" when attaching (I only tested in gmail). Then choose Gallery as your picker, and set the checkmark so next time you won't be asked.

    The Pro version lets you include some EXIF data and control the filenames of the reduced version. Try the free version before buying the pro, or just keep using the free version (or build the pro version from source, if fancy so takes you).

    Needs Android 2.0.
    1
    It crashes on htc one s, as soon as I share a picture to "SendReduced". :(

    If you have root or a pre-JB system, send me (arpruss@gmail.com) a log via catlog after the crash.