Pi-Hole works everywhere except Android Phones

Android phones and Google devices (i.e. Chromecast) have their own hardcoded DNS servers, so this issue has to be fixed at a router level. Using FreshTomato firmware (administration > Scripts > Firewall).

If you want a network wide solution, paste these iptables rules to your router. It forces all DNS requests to the pihole, regardless of individual device settings. It then uses masquerade to make the device think that it got the result from the original DNS server it was trying to query. 192.168.1.100 is my pihole's local IP.

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -I PREROUTING -i br0 -p tcp --dport 53 -j DNAT --to 192.168.1.100:53
iptables -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to 192.168.1.100:53
iptables -t nat -I PREROUTING -i br0 -p tcp -s 192.168.1.100 --dport 53 -j ACCEPT
iptables -t nat -I PREROUTING -i br0 -p udp -s 192.168.1.100 --dport 53 -j ACCEPT