Is there any way to use UPnP for NAT traversal on Android with a 3G/4G connection, and if so, is it carrier dependent?
Instead of trying to use uPnP (which is a security risk because it lease an unmapped port open), you might want to either use STUN to get a public ip/port and then establish a UDP connection which you can tunnel psudo-TCP through, or use a TURN server. For carrier grade NAT, if you don't want to pay for relaying, there is also this technique, which might sometime work:
https://drive.google.com/file/d/0B1IimJ20gG0SY2NvaE4wRVVMbG8/view?usp=sharing