text:
How to assign Mobile Data's public IP to host connected on hotspot?
I've looked around but found nothing on this subject.
I have an Android phone with a public IP given by sprint. Tethering on Android uses NAT, so if I want to access any of the devices behind the phone I have to use port forwarding (Which I'd really rather not do). Is it possible to set tethering to bridged (Disable NAT), so the device behind the phone will be given the public IP?

What sort of devices do you want to access and what would you be using to access devices behind the Android phone?

Your question already contains the answer: with a public IP given by sprint. You get exactly one IP address not multiple. A mobile network is AFAIK not like a LAN where you can simply get as many IP addresses via DHCP as you need. Only with IPv6, bridging may be possible if you get a subnet instead of one address.

I am trying to give a mikrotik router my phone's static IP so I can log directly into it remotely. The FWD app works, but it has it's limitations. As for the issue with a mobile network handing out multiple IP addresses, I only want to connect one device behind the phone, and I want the phones public IP to be given to it. So no additional IP addresses needed.

Let's say rmnet_data1 is your Mobile Data interface (on Qualcomm devices) and wlan0 is WiFi interface. When you switch on Mobile Data, your ISP assigns rmnet_data1 an IP address, possibly dynamic and not necessarily a public IP (see details in this answer), but let's assume it is a static public IP - say 1.2.3.10. When you switch on tethering, wlan0 is turned into AP mode and a static IP is assigned (used to be 192.168.43.1 but is randomized since Pie). A DHCP/DNS server (dnsmasq) is listening on this interface to assign dynamic IP addresses to any hosts which join the local network.
Now phone is essentially a router connecting two networks (different subnets) at gateways (rmnet_data1 for external/public network i.e. WAN and wlan0 for local/private network i.e. WLAN). Since only one IP is assigned by the ISP to your phone, phone is doing NAT (at OSI layer 3) to make internet accessible for all local clients. As in your case the only connected host (router) is assigned address, let's say, 192.168.43.10. You'll have to do specific Port Forwarding or DMZ to access the router from internet.
BRIDGING ON LINUX / ANDROID:
What you want to do is assign address 1.2.3.10 to the router using Ethernet bridge as you stated in comment:

I only want to connect one device behind the phone, and I want the phones public IP to be given to it.

If you want to retain current network configuration on device, Ethernet bridging - which is an alternative to NAT for internet sharing - doesn't seem to be an option at all, unless you get a whole subnet (e.g. /30) from ISP instead of a single IP address. See Appendix A for reasons.
BRIDGING ON MODEM / ROUTER:
That said, what you are looking for is called Half Bridge Mode; a feature provided in many modem/router combo devices to avoid the problem of double NAT. It's also called IP Pass-through, IP Extension, DHCP Spoofing or True DMZ by different manufacturers. Other operation modes on ISP provided combo devices are NAT and Full Bridge.
We can use some workaround to expose the public IP to connected host. It involves changing IP configurations and kernel routing policy/tables, so it breaks internet connectivity on Android device. That's not a problem on modems/routers, but on Android it is. So we have to use NAT for Android's internal traffic (see Appendix B).
HOW TO TURN ANDROID INTO HALF-BRIDGED MODEM / ROUTER?
ISPs doing CGNAT usually create small subnets for connected clients, in case of public IP it could be even /8. In our case, let's say, the network ID is 1.2.3.8/30, so 1.2.3.9 will be the ISP's gateway address. There are different approaches we can go with, see Appendix C.
Rest of the details are given in the following script which can be executed followed by dhcp, static, arp or stop argument:
#!/system/bin/sh
set -e

[ "$(id -u)" = 0 ] || { echo 'Not running as root!' >&2; exit 1; }

# internal filed separator
IFS=$' \t\n'

##########################
# define / get variables #
##########################
SSID=MyAP                           # set this to your desired string (avoid spaces and non-ascii characters)
PASSCODE=foobarfoobar               # set this to your desired string (8 to 63 characters)
PUB_IFACE=rmnet_data                # set this according to your device (Qualcomm SoCs use 'rmne_data[N]')
WIFI_IFACE=wlan0                    # set this according to your device (check with 'lshw' or 'ip link show')
AP_IFACE=${WIFI_IFACE}-AP           # we'll create new WiFi interface for hotspot
DIR=/data/local/tmp/$AP_IFACE       # where to put config files
LOCAL_SUBNET=192.168.1              # for public interface
PST_RT_CHN=my_chain                 # to define source NAT for local packets
DNS1=1.1.1.1
DNS2=1.0.0.1

# read public interface name, IP and mask
read -r PUB_IFACE PUB_IP MASK <<< \
    $(ip -4 -o a | tr -s ' ' | awk -F'[ /]' '/'"$PUB_IFACE"'/ {print $2,$4,$5}')

# read ISP's default gateway
GW=$(ip r s t all | awk '/^default/ && /'"$PUB_IFACE"'/ {print $3}')

# ip for WiFi hotspot interface in public subnet
AP_IP=$GW/$MASK

############################
# start / stop bridge mode #
############################
STOP()
(
    echo 'Cleaning up...'

    # ignore errors
    set +e

    # don't print error messages
    exec >/dev/null 2>&1

    # hope there are no other instances of same daemons
        pkill -15 hostapd
        pkill -15 dnsmasq
    # remove local IP from public interface
        ip address del ${LOCAL_SUBNET}.1 dev $PUB_IFACE
    # remove rule and clear RPDB cache
        ip rule del lookup main
        ip route flush cache
    # flush main table
        ip route flush table main
    # disable forwarding
        printf 0 >/proc/sys/net/ipv4/ip_forward
        iptables -D FORWARD -i $AP_IFACE -o $PUB_IFACE -j ACCEPT
        iptables -D FORWARD -o $AP_IFACE -i $PUB_IFACE -j ACCEPT
    # stop listening on DHCP port
        iptables -D INPUT -i $AP_IFACE -p udp -m udp --dport 67 -j ACCEPT
    # stop local NAT
        iptables -t nat -D POSTROUTING -j $PST_RT_CHN
        iptables -t nat -F $PST_RT_CHN
        iptables -t nat -X $PST_RT_CHN
    # delete AP interface
        iw $AP_IFACE del
    # delete config directory
        rm -rf $DIR
)

if [ "$1" = stop ]
then
    STOP
    exit

elif [ "$1" != dhcp -a "$1" != static -a "$1" != arp ]
then
    echo 'Usage:' >&2
    printf '\t%s\n' "$(basename "$0") dhcp|static|arp|stop" >&2
    exit 1
fi

################
# basic checks #
################
if [ -z $PUB_IP ]
then
    echo 'Turn on Mobile Data first.' >&2
    exit 1
fi

if ! iw phy | grep -A10 'Supported interface modes:' | grep -q '\*[ ]*AP'
then
    echo 'AP mode not supported.' >&2
    exit 1
fi

if ! iw dev $WIFI_IFACE link | grep -q '^Not connected'
then
    echo 'First disconnect form Wi-Fi.' >&2
    exit 1
fi

##########################
# clear previous configs #
##########################
STOP

# clean up if error occurs
trap '[ $? = 0 ] || STOP' EXIT

#####################################
# create virtual wireless interface #
#####################################
if ! iw dev $WIFI_IFACE interface add $AP_IFACE type __ap
then
    echo "Couldn't create AP interface." >&2
    exit 1
fi

####################################
# configure interfaces and routing #
####################################
echo 'Configuring network...'

# add local IP to public interface and delete public IP
ip address add ${LOCAL_SUBNET}.1/30 dev $PUB_IFACE
ip address del $PUB_IP/$MASK dev $PUB_IFACE

# activate the WLAN interface
ip link set dev $AP_IFACE up

if [ "$1" = dhcp ]
then
    # assign ip in public subnet to WiFi hotspot interface
    ip address add $AP_IP dev $AP_IFACE

elif [ "$1" = static ]
then
    # assign ip in local subnet to WiFi hostspot interface
    ip address add ${LOCAL_SUBNET}.2/30 dev $AP_IFACE

else
    # start proxying ARP queries both ways
    printf 1 >/proc/sys/net/ipv4/conf/$AP_IFACE/proxy_arp
fi

# clear auto added routes and add new
ip route flush table main
ip route add $PUB_IP dev $AP_IFACE
ip route add default via $GW dev $PUB_IFACE
ip route flush cache

# Android doesn't look up into main table by default
ip rule add lookup main

# let packets be forwarded
printf 1 >/proc/sys/net/ipv4/ip_forward
iptables -I FORWARD -i $AP_IFACE -o $PUB_IFACE -j ACCEPT
iptables -I FORWARD -o $AP_IFACE -i $PUB_IFACE -j ACCEPT

# apply source NAT on internally generated packets
iptables -t nat -N $PST_RT_CHN
iptables -t nat -I POSTROUTING -j $PST_RT_CHN
iptables -t nat -I $PST_RT_CHN -o $PUB_IFACE ! -s $PUB_IP -j SNAT --to-source $PUB_IP

#######################
# access point daemon #
#######################
# create configuration file
mkdir -p $DIR
cat <<-HOSTAPD >$DIR/hostapd.conf
    # network name
    ssid=$SSID
    # passphrase to use for protected access
    wpa_passphrase=$PASSCODE

    # maximum STA clients allowed to connect
    max_num_sta=1

    # network interface to listen on
    interface=$AP_IFACE
    # wi-fi driver
    driver=nl80211

    # set operation mode, 'g' for 2.4GHz band
    hw_mode=g
    # WLAN frequency channel to use
    channel=1

    # key management protocol; use pre-share key
    wpa_key_mgmt=WPA-PSK
    # enforce WPA2
    wpa=2
HOSTAPD

echo 'Starting hostapd...'
hostapd -B $DIR/hostapd.conf

##########################################
# IP assignment; manually or dynamically #
##########################################
if [ "$1" = dhcp ]
then
    # create configuration file
    cat <<-DNSMASQ >$DIR/dnsmasq.conf
        # we dont want DNS server, only DHCP
        port=0

        # network interface to listen on
        interface=$AP_IFACE
        bind-interfaces

        # nameservers to be sent to clients
        dhcp-option=6,$DNS1,$DNS2

        # range of IPs to make available to wlan devices and when to renew IP
        dhcp-range=$PUB_IP,$PUB_IP,24h
        # where to save leases
        dhcp-leasefile=$DIR/dnsmasq.leases

        # respond to requests from a different IP broadcast subnet
        dhcp-authoritative

        # log extra information about DHCP handshakes
        log-dhcp
    DNSMASQ

    # open listening port for dnsmasq
    iptables -I INPUT -i $AP_IFACE -p udp -m udp --dport 67 -j ACCEPT

    echo 'Starting DHCP server...'
    dnsmasq -C $DIR/dnsmasq.conf </dev/null

else
    echo
    echo 'On connected host disable DHCP, set DNS and do:'
    echo 'ip a f dev <wifi>'
    echo "ip a a $PUB_IP dev <wifi>"
    echo 'ip r f t main'

    if [ "$1" = static ]
    then
        echo "ip r a ${LOCAL_SUBNET}.2 dev <wifi>"
        echo "ip r a default via ${LOCAL_SUBNET}.2 dev <wifi>"

    else
        echo 'ip r a default dev <wifi>'
        echo 'ip n f dev <wifi>'
    fi

    echo
fi

echo Done.

NOTE:

All of the required binaries (iw,ip, iptables, hostapd, dnsmasq) are available on Android but hostapd doesn't work on command-line. I used a static built binary, tested on Pie.
Based on the factors discussed here, your ISP may figure out (and mind) that your traffic is not originating from Android device.
After stopping half bridge mode, you need to turn Mobile Data OFF and ON to resume normal working because routes are cleared. Also on device boot you may need to switch on WiFi once so that wlan0 interface is created.
ISP's nameservers - if needed - (and default gateway) can also be obtained by:
~$ dumpsys connectivity | grep CONNECTED | grep -o 'Routes: .* DnsAddresses: [^ ]*'
Routes: [0.0.0.0/0 -> 1.2.3.9 rmnet_data1,1.2.3.8/30 -> 0.0.0.0 rmnet_data1,] DnsAddresses: [1.1.1.1,8.8.8.8,]

VERIFICATION:
Your configuration should look like this:
1. Routing
==========
~$ ip rule show
0:  from all lookup local
9999:   from all lookup main

~$ ip route show table main
default via 1.2.3.9 dev rmnet_data1
1.2.3.10 dev wlan0-AP

2. Forwarding
=============
~$ cat /proc/sys/net/ipv4/ip_forward
1

~# iptables -S
-A FORWARD -i rmnet_data1 -o wlan0-AP -j ACCEPT
-A FORWARD -i wlan0-AP -o rmnet_data1 -j ACCEPT

3. Source NAT
=============
~$ ip -4 -o address
rmnet_data1    inet 192.168.1.1/30

~# iptables -t nat -S
-A POSTROUTING -j my_chain
-A my_chain ! -s 1.2.3.10/32 -o rmnet_data1 -j SNAT --to-source 1.2.3.10

4. Access Point Daemon
======================
~# iw dev
        Interface wlan0-AP
                ssid MyAP
                type AP

5 (a). DHCP Server
==================
~$ ip -4 -o address
wlan0-AP    inet 1.2.3.9/30

~# netstat -lup
Proto    Local Address   Foreign Address  PID/Program name
udp      1.2.3.9:67      0.0.0.0:*        23693/dnsmasq

~# iptables -S
-A INPUT -i wlan0-AP -p udp -m udp --dport 67 -j ACCEPT

5 (b). Static IP
================
~$ ip -4 -o address
wlan0-AP    inet 192.168.1.2/30

5 (c). Proxy ARP
================
~$ cat /proc/sys/net/ipv4/conf/wlan0-AP/proxy_arp
1

APPENDIX A:
Why Ethernet bridging isn't a straightforward option on Android:

There are at least two hosts on your local network; phone and router, but only one IP address is received from ISP. Two hosts on same network can't have same IP address.
If you transparently bridge rmnet_data1 and wlan0, both can have same IP address i.e. 1.2.3.10 but router still needs to be assigned another IP address, either statically or by DHCP server from ISP side. If you don't assign full bridge an IP, internet connectivity will break on Android which can't work (see Appendix B).
Ethernet bridging (which operates at OSI L2) doesn't work for WiFi interfaces in STA mode without WDS / 4addr support (on both sides of WiFi) which isn't supported by all physical interfaces. In AP mode, however, WiFi interface supports bridging, but 3G/4G interfaces don't. A recent patch to rmnet adds bridging support only for interfaces which can send MAP data.
An alternative to Ethernet bridging is proxy ARP (at OSI L3) or something like wlan_kabel which can be applied to both interfaces. But again you need three or at least two IP addresses; one for phone and one for router.

APPENDIX B:
Why NAT is required on device?
Modems have their own processors - called baseband or communication processor (BP or CP) on Android devices - and they run their own minimal RTOS. On small devices like phones they are integrated in SoCs. Communication with modem is done using a set of standard control protocol. AT commands is the traditional one used with PPP (1, 2), but manufacturers have developed new methods (e.g. QMI (3, 4, 5) / RmNet (6, 7) on Qualcomm devices).
The closed source vendor specific control/data modem protocols used on Android devices are not (or at least well) documented. Vendors provide native RIL Daemon as a binary blob which communicates with modem through RILJ and telephony framework in Java stack. When we turn on Mobile Data, these components work together to authenticate with MNO (by reading SIM data, APN settings etc.) and then configure the network stack (IP, DNS, route etc.) to make internet connectivity possible. So the modem is available to Android OS as in full bridge mode (no NAT involved on device).
Using methods explained above we assign public IP to connected host, so Android device itself loses internet connection. As soon as we make a change to the IP configuration, Android's telephony stack detects disconnections and sends a reset command to modem (through RILD) and whole network stack is refreshed with new (or same) IP settings received from MNO.
So to set Android device in Half Bridge mode, a more reliable approach is to take full control of communication with modem by altering the telephony framework (which isn't a simple task). As a workaround we do source NATing for internally generated packets on Android device so that it's not disconnected from internet. While the public IP is routed without any NAT to the only host connected to wlan0 interface, so that it's accessible from internet.
APPENDIX C:
Routing Methods for Half Bridge Mode on Android:

DHCP:
Assign 1.2.3.10 to your router using DHCP server, 1.2.3.9 to wlan0 and 192.168.1.1/30 (or any other private IP) to rmnet_data1. It's also possible to create a hypothetical 1.2.3.0/X network and assign random IP from that hypothetical network to wlan0. But public IP address must not conflict with subnet ID or broadcast address in the faked subnet. It becomes difficult to achieve if IP is assigned dynamically, particularly if IP class and subnet mask keep on changing from ISP.
In this way AP interface and router appear on same local network, and wlan0 IP is set as default gateway (next hop) for router. Here we are faking an IP address (at OSI L3).
Static Route:
Setting IP/DNS on router manually allows you to assign local IP address to AP interface instead of using pseudo IP address. Add AP's IP address as default gateway on router. However router might have problem using default gateway on different subnet.
ProxyARP:
Another option when not using DHCP is ProxyARP (8, 9, 10). If wlan0 has no IP address, we need to add a static route without IP address as default gateway. So router can't query gateway's MAC address and thus keeps asking wlan0 (in global broadcasts) where an internet address (next hop) is. It's because target of ARP queries is always the IP address, either of a local host or of default gateway (if destination IP is on another network).
Due to ProxyARP, wlan0 provides its own MAC address for every ARP query received from connected host. ARP queries from rmnet_data1 (for 1.2.3.10's MAC address) are forwarded/received by wlan0 to/from connected host. rmnet_data1 itself doesn't have a MAC address (like PPP). A side effect of this approach is that the connected router will pollute its ARP cache by associating every visited internet address to AP's MAC address. Here we are faking a MAC address (at OSI L2).

CREDITS:

Implementing PPPoE half-bridge/ip-passthrough to suit IPSec VPN firewall appliance with Linux
Half bridge with PPPoA
HALF-BRIDGE mode in Routertech 2.2/2.3

Have a look at this thread about using open VPN. Here you can give public IPs to devices using Open VPN, I think.
Or you could find another tethering app which supports this such as PdaNet+ which may have more control.


text:
Can't remove Phone permission to app
I'm trying to remove the Phone permission from this app (Pango פנגו) - but it just doesn't work!
I deny it, and it just comes back:

What I tried:

Clearing data of the app
Re-installing
Disable all permissions (still phone comes back)

Any idea? It's so weird.
Details: LG G5, stock, no root, Android 7.0

Maybe enable the stock phone app to be default phone app, and then try again. If not, uninstall the app, reinstall.

The phone app is set to default, and already tried to re-install - still nothing :(

source: Stack Exchange

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

sort: votes


text:
Is there some documentation on which character sets are definitely supported by Android version?
There is a lot of vague information such as "Android supports RTL since 4.1.1", from which I abduce that Android natively supports (some) Arabic, Hebrew, Persian and Urdu characters. Likewise some question on Stack Overflow such as What glyphs or character sets are included in Roboto fonts?, which is not definitely answered.
There are many scripts which are obscure by Silicon Valley standard but used by millions of people, such as Syriac or Amharic. I have noticed that new versions of Android display Syriac (since Oreo?), and further back (JellyBean?) support Amharic.
But I find it very difficult to just find a plain list of supported alphabets per Android version. Is it different per manufacturer, or does Google require every Android distribution to support at least a certain character set?
If I download an app with Amharic translations targeting API versions > JellyBean (for instance) should the developer include a font in the APK to be sure that I won't see tofus?

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/


text:
How to send whatsapp messages without saving number?
Please let me know, without using any third party application, how to send whatsapp message without saving a number in contact?
Regards
Smith

You will need to do the following trick
https://api.whatsapp.com/send?phone=xxxxxx
Copy this and paste it on your browser, please replace "xxxxxx" with the phone number (with country code but without +. Example= https://api.whatsapp.com/send?phone=901234567890), then hit enter. This will redirect you to WhatsApp and you will begin to talk to contact without saving the phone.

Yes, download SharkID app and login.
From their Dialer Screen, type your numner and Swipe Left. You will see the 'WhatsApp' button, click on it. If WhatsApp is installed then, it goes directly to that number.

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/


text:
What notification icon is this fish?
This is on an S7 Edge.  I do not have this phone in my possession.  This is from a screen shot of a text they sent.  This "fish" icon was in the notification bar at the top left. I have searched in reverse image and cannot get an app name.  Does anyone recognize this icon?
Thank you

It's a game notification from Fishdom

By clicking on the notification (icon) you should always get a popup to the app which pinned the message!
And if you pressing/ holding the icon long you can select the app-info for more details!
If missed to clicking the app or you accidently swiped away use the Andorid-Notification-Log


text:
LineageOS update files not present in /data/lineageos_updates since 27th April 2018
Since the update from 20th April 2018, I can't find the LineageOS update in the current path which is /data/lineageos_updates . When I download the latest update (27th April 2018) and reboot in TWRP, there is no corresponding update file in the folder. After a reboot, the updater in the settings show me that this update isn't downloaded - altouth it did before the reboot.
Comments say that they found the update in /LineageOS updates/ (internal storage) but on the Samsung Galaxy S4 it doesn't contain the latest update. Only a outdated version of February. No idea, how those old update got there. I didn't ever now that those folder exist. I only know /data/linageos_updates as current update location store and /data/data/org.lineageos.updater/app_updates for older updates before August 31st, 2017.
So in the current situation, I'm not able to update LineageOS on this Galaxy S4 directly. I want to avoid downloading the update from a PC and moving it to the device since it's not mine and the owner is a non-technical user.

I'm not aware of the causing issue, but have found a workaround for fixing: I downloaded all avaliable updates (the owner last updated in March) and bootet TWRP. Now I searched for the last update that I found in /data/lineageos_updates and installed it.
In my case, it was from 10th of April. This update seems to be something special: The updater say it's from 10th of April, where the LineageOS download page list it as 11th of April. I installed the update and every single following update by hand. This worked and made them visible in the expected /data/lineageos_update path.
Don't know what's the reason for this. I assume that some changes were made on the update process in one of those update (maybe the one from 11th of April or another one) and those changes weren't included properly in the following updates. But at least those steps are a workaround, when you're not able to install the latest LineageOS update any more.


text:
Why does Google intentionally disable features in most countries?
Why does Google intentionally disable features in most countries? Prime example being, Google Pay for Wear OS.
Background: Google Pay actually works just fine in most countries as far as I can tell, but with the Oreo update the app is constantly being disabled. If you enable it, it still continues to function as per normal.
Question: What benefits do Google get for locking this down in countries other than their selected handful?

Legal reasons I'm sure.

@SiXandSeven8ths Do you know what legalities are limiting them here? Wouldn't the fact that it still works for short periods of time mean they are still violating any legal restrictions?


text:
retriving my contacts
I restored my phone sonny xperia E5 to factory settings then after I sinned in with my google account but I am unable to synchronize my contacts please help me my contacts are saved in google account

what kind of help do you expect?

Hi and thanks for your question on
How to Retrieve Lost Contacts from Google
I hope this screenshot I grabbed from Google will help you:

And here's a written summary of the steps:

Go to your device settings and choose 'Google'.
Under 'Services,' select 'Restore Contacts' (tap 'From Account' if you have more than one account and need to specify which you want to restore)
Then tap the device with the contacts to copy and select which contacts specifically you would like to copy
Lastly just hit "Restore" and wait til you see the "Contacts Restored!" message.  These will sync automatically.
For contacts in other apps like Outlook, you will need to re-download those apps and follow their procedures.
Again, I hope this helps!  Have a great day!

Please paste the text from the source in a quoted format, instead of a screenshot. It's much better, and also allows searching.


text:
Can android phones use micro SD storage in the same way they do internal storage?
Dose putting a micro SD card in your android phone allow the OS to mount the SD card and use the storage space the same way it would internal memory eg. photos taken on the phone would be saved to the micro SD card. Or does the android OS treat the micro SD card as an "external storage source" the same way a laptop treats an external USB flash thumb drive ?
The phone in question is a Samsung Galaxy J5 2016.
If its not possible to mount the external storage and use it like "internal storage" is it possible to set that all photos are to be stored on the external storage as this is whats taking up most of the room on the phone.

This depends on the vendor.  For example Samsun blocks some functionality the sd card allows in stock android because they claimed it would confuse users.

@William - thanks ive updated the question to add the phone make / model

Adoptable storage is the term I believe you are looking for.  It isn't enabled by default.

What Android version are you using and is your phone rooted tor not?

If you are just looking for saving photos to sd-card: https://android.stackexchange.com/a/106519/143375

If the partition, the internal sd-card section is located on supports symbolic links it should be possible to replace the DCIM directory with a symbolic link to a directory on the external sd-card. Has anybody ever tried that?

Since Android 6.0 (Marshmellow), Android supports Adoptable Storage. However, many phone manufacturers, including Samsung, have disabled this feature on their phones.
How to use Adoptable Storage on supported devices:
If you do have a phone that supports this feature, you can turn it on by following these instructions:

Put an SD card in your device.
Open "Settings", "Storage", the SD card, click the three vertical dots, and press "Storage Settings".
Tap "Format as Internal".

What it does:
Here's how Adoptable Storage works, according to source.android.com:

When external storage media is adopted, it’s formatted and encrypted to only work with a single Android device at a time. Because the media is strongly tied to the Android device that adopted it, it can safely store both apps and private data for all users.
...
Apps can be placed on adopted storage media only when the developer has indicated support through the android:installLocation attribute. New installs of supported apps are automatically placed on the storage device with the most free space, and users can move supported apps between storage devices in the Settings app. Apps moved to adopted media are remembered while the media is ejected, and return when the media is reinserted.

So not only does the device have to support Adoptable Storage, but the apps have indicate support for it too to be able to be stored on the SD card.

Thanks @Flimm when you say "Samsung have disabled the feature on their phones", and then "How to turn it on" below are you referring to how to turn it on, on Samsung phones or how to turn it on, on phones that allow it only ?

@sam google it.  Experiment.  I have tried enabling this using adb through terminal and it didn't work.  Most likely this is not changeable on a large majority of Samsung phones.

@sam I edited my answer to clarify the first heading.

No, in Android Micro-SD is taken as an external device.
Also in the context of your question if you are talking about programming an Android App, Google doesn't recommend to use an external Device, because they are temporary storage. They Say:-

Every Android device supports a shared "external storage" space that you can
  use to save files. This space is called external because
  it's not a guaranteed to be accessible—it is a storage space that
  users can mount to a computer as an external storage device, and it
  might even be physically removable (such as an SD card). Files saved
  to the external storage are world-readable and can be modified by the
  user when they enable USB mass storage to transfer files on a
  computer.

So before you attempt to access a file in external storage in your app, you should check for the availability of the external storage directories as well as the files you are trying to access, then perform your operation in it.
For more info, see the official Android developer documentation on data storage.

Have you considered the feature Adoptable Storage on Android?

Because you have a Samsung phone there is no easy (offical) way to format your sd-card as Adoptable Storage if it's that you are looking for.

However using adb it's still possible:

Connect your phone (with insert sd-card) to your computer and make sure USB-Debugging is allowed
Open adb-shell (How you do that it matters what OS are you using on your computer your phone is connected)
Type sm list-disks then it outputs the name/ value of your sd-card
Use sm partition <DISK> private and put the disk-value in that it looks like: sm partition disk:179 private
Then restart using: reboot
Now it shares the internal-storage with the sd-card and when you install apps it fills up internal and sd-card in a relation 50:50

Notice that all of your data on the sd-card gets erased. I don't know if it's also erase your internal (it depents on device and android-version). Also your memory will not anymore be displayed correctly as you can see here. There is no root required but it won't work on every device. Some users say it works others say it doesn't. At least you can try it.
BTW. here is a guide how you install and open adb-shell for every common OS, if you don't know how to do that!


text:
What is USB BICR function in android?
In the build.prop file I found an entry commented "Enable USB BICR function" (ro.sys.usb.bicr). I searched in Internet, but I did not find anything useful. Maybe you know?

I found some hints in the MediaTek (MTK) kernel sources.
There is no description but with a bit of guessing it seems that this option allows you to present a virtual USB CD-ROM when connected via USB to a PC. Often this is used for providing specific drivers that are required for accessing special functionality of the device. The virtual CD is present on the Android device in form of a ISO-image.
From my understanding this option is only relevant for developers creating a custom ROM.


text:
Can I transfer my sms messages from my old phone to my new phone WITHOUT using any third party software?
The only answers I have been able to find want me to download third party software. It is NOT an acceptable solution to expose all of my SMS history to a third party. Maybe there's an open source solution?

With root
If you're rooted or willing to root, you can check out this method: Where on the file system are SMS messages stored?
Note: If you're transferring between different versions of Android, or even ROMs, I would check if the SMS format is the same.
Third party app

There's SMS Backup+, which is an open source app I found - GitHub, Google Play.
I'm using SMS Backup & Restore for a long time (maybe years) - from their Privacy Policy, it seems that the only data they send is anonymous usage data to Google Analytics.

Note: You can use a well reviewed and popular third party app from play store (bonus if it's an editors choice), and after installing it (before even opening) - move to flight mode, backup locally, remove the app and transfer to your computer or other phone.

thanks, I didn't realize that sms backup+ was open source.


text:
Why does this string of LTR and RTL markers cause Android devices to 'hang'?
I received this innocent-looking message forwarded from my brother on Whatsapp claiming that it could 'hang' my phone.

And sure enough... touching it would make my Android Samsung J2 running Android 6 freeze over for a while; it would ask me if I wanted to force close the app or wait.
I suspected there was more than met the eye here and copied the message over to my laptop and pasted it on an editor and opened the file through python and this is the string that I get from python. Turns out whoever is doing this is using/misusing the Unicode \u200e left-to-right, \u200f right-to-left, and \u2067 'right-to-left-isolate' character interspersed with some spaces to do this mischief. All the apps I've tried are falling victim to this tiny prank.
Below is the message in its Unicode hex format:-
"\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f \u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u200e\u200f\u2067 ereh-hcuot-t'nod"

Questions:

What does this string actually cause text editing programs to do? Make them go left and right too many times?
Why does this cause Android apps to 'hang' or crash?
Going off reports from my friends, this problem doesn't seem to affect iPhones. Why?

Tom Scott did an interesting video on the subject
Fundamentally, the fact that it is triggered by touching the text probably means it's a bug in the code responsible for working out which part of the text is highlighted (which is not at all trivial in Unicode) so it can be copied/pasted or otherwise manipulated. Given it hangs, it is possible there is an exponential blowup or infinite loop in the algorithm due to the many LTR/RTL transitions. I'm not aware of any detailed analysis of the source code and bug, though one may appear from the android team at some point.
iPhones have a completely different set of text rendering and interface libraries, so they will likely use a different algorithm here, or at least one which suffers from a different set of bugs.


text:
What can be the reason for "internet may not be available" though the IP address was obtained
Only one device with Android (SM-G390F, Android 7.0, G390FXXU2ARA1, 3.18.14-12962328) at my home stopped connecting to Internet through my WiFi router with the message "internet may not be available" and an exclamation mark on the WiFi sign. (Whereas older non-updated Android devices, GNU/Linux and iOS devices work.)
If I examine the current network configuration with ip a in a Terminal in the device, it has got the correct IP address, but pinging the router (ping 192.162.1.1) looses all pings... (ip ro showed a route to this network, but no default route -- but that shouldn't have affected the pinging of the router anyway.)
The WiFi router is an ASUS one, and for this device, in the log, it prints several times (not more than 10; the repetition is only for this device):
udhcpd: sending OFFER of 192.168.1.8

and then:
udhcpd: sending ACK to 192.168.1.8

The DNS servers from the DHCP configuration seem to be working well (as tested from other connected devices).
Changing the advanced settings from DHCP to manual does not help. And it is quite strange that this device used to work with this WiFi router all the time before a couple of weeks ago... Nothing has been changed.

Strangely, this advice from 2016-09-14 concerning the WiFi router configuration helped:

Inside the router configuration (e.g., accessing the IP 192.168.1.1), change the "Group key update" value from 0 to 30 seconds, under the "Wireless > Security" configuration, right below the WPA-PSK/WPA2-PSK item.
Router: TP-LINK TL-WR740N / TL-WR740ND.

(My router model is different.)
I'm a bit worried that 30 sec as the group rekeying interval is the minimal possible, whereas the recommended value is 3600 sec (1 hour), as I've read on the web.
But for now, I haven't yet tried to experiment with since it began working. Also, I have left the static manual IP configuration instead of DHCP on the Android device (matching the reserved IP address for this MAC address manually in the router settings), although this alone didn't make it work. (But I'm not changing this, unfortunately for the experiment, because I don't want to break the current working state.)

x-posted as a comment to a discussion of a similar situation at https://www.reddit.com/r/GalaxyS8/comments/7qmorv/cant_connect_to_wifi_internet_not_available/dydhprd/

No, this isn't a stable cure. Probably, this might be because the Russian Censorship Agency is blocking the Google servers which are used to check that the Internet connection is live (the ones for push notifications) because Telegram uses push notification to distribute the new not-yet-blocked IP addresses for connections.

I should have a look whether I've got Settings -> Wi-Fi -> Advanced -> Avoid poor Internet connection mentioned here https://android.stackexchange.com/a/23281/13117

Getting an IP address on a network does not tell the device anything about if or if not access to the Internet is possible.
Therefore whenever Android connects to a network it performs a network connectivity check: It sends a HTTP request to a Google server.
The common URLs for checking network connectivity are:

http://clients3.google.com/generate_204
http://connectivitycheck.gstatic.com/generate_204

If the URL sends back to expected response Android assumes that it has a working Internet connection. Otherwise it assumes that no Internet connection is available. In the latter case the user is notified as you have observed.


text:
Stop weather forecast calendar events on smart watch
I have a Garmin Fenix 5 connected to a Pixel XL.
On the Fenix 5, the calendar widget shows a weather forecast as an all day event. This is redundant (there is already a weather widget on the Garmin), and unwelcome (it clutters the calendar view and makes it less useful).  These Forecast "events" do not show up in the calendar app on my phone.  Where are they coming from and how can I remove them?
Context and what I have tried:
I have two cloud accounts in android account manager with calendars: google account (personal) and office365/exchange account (work).  I have tried hiding all calendars from the calendar app settings (including the "Holidays" and "Birthdays" under "Other" and "Events from Gmail"), the result was that no events are shown on the phone, and only the mysterious forecast events are seen on the watch.  I have gone to each calendar on both google and office 365 via the web, there is no forecast events shown.  I have explored for relevant settings for both via the web sites, and outlook for mac (for o365).  In office365, there is an option to show a weather forecast event, but I have turned it off for all calendars, with no result.  I also uninstalled the google "news and weather" app and do not have any other weather app installed except google assistant.
One last data point: the forcast is for a location I lived previously, before I even got my Garmin.
How can a calendar event to show on the smart watch but not the calendar app?

While not an answer per-say, I was able to see the calendar where the events where coming from by downloading the app Any.do and connecting to google calendar, even though it still did not show on Google Calendar app nor web.
After removing the google account totally from my phone (Android Settings->Accounts), and then re-adding it, this weather calendar did not reappear.

If you stumble upon the same issue - here's a solution, that worked perfectly 4me:
https://support.google.com/calendar/thread/6260804?msgid=22824877

Welcome to Android Enthusiasts! Whilst this may theoretically answer the question, it would be preferable to include the essential parts of the answer here, and provide the link for reference. Consider [edit]ing to summarize the content and/or expand the answer!


text:
How To Transmit (text/tweet) Temperature and Humidity Data From a Samsung S4
I'd like to be able to use my Samsung S4 as a wireless temperature/humidity for a climate controlled storage unit.  Does anyone know of a way to have that data texted/tweeted from the phone?

I'd check with some [tag:automation] app. No idea whether there's a dedicated app, and I doubt anything comes preinstalled for that.

Thanks for the automation suggestion.  For anyone interested in this, I've tried the following apps with no success: "Thermometer & Hygrometer" & "Weather Station"


text:
Where can I find ROM images for Samsung Galaxy Tab 2 10.1 (GT P5113)?
I've stopped using my tablet several years ago out of frustration. Ever since Kit Kat/4.4.4 everything has slowed to a near unusable crawl. I tried rectifying this by flashing it with a SlimRoms OS (SlimKat) but it only improves things moderately and some applications, like YouTube, crash often.
I'm looking to see if maybe Jelly Bean runs better, but so far I've had no luck with it. The Samsung downgraded firmware just puts it into a boot loop and I cannot find a compatible SlimRom, Lineage OS, or Cyanogenmod. Does anyone know if one exists?

https://forum.xda-developers.com/galaxy-tab-2

I've searched most of those sites to no avail. Many dead links and the only available ROM seems to be SlimKat.
@AndyYan Your link does not have links to any ROM other than SlimKat.

The "unified" have up-to-date ROMs.


text:
Mi Max 2 Xiaomi apps as default immutable setting
I'm using a Xiaomi Mi Max 2 phone.
At the last time I was able to open links with a browser of my choice. But now, the "browser" only is imposed. Additionally, there is a lot of Xiaomi tools and apps that appeared, as App Vault, shortcuts and calendar from Xiaomi that take the control of my phone.
How can I get there out?

You might be able to disable them. See https://android.stackexchange.com/q/56620/96277

Thanks, but my phone is not rootable @Firelord


text:
Signal Problem of S8+
I recently bought a Samsung S8+. The phone is alright but I got stuck in a problem. One of the network provider SIM is not working. As a simulation, I used following steps:

I exchange the slots, other sim was working fine on that slot.
I bought another sim of the same network provider and tested in both slots, still no service.
I moved to a region out of my university, that was working fine, as soon as I entered back, then again no service.
I put the same network provider sim in other phone at exactly the same location where s8+ was giving zero signals, the sim was providing full signal, hence it came out that the problem of signal jam was out of concern.
I restarted, factory reset the phone, but still the problem persists.

P.S I recently bought and in two days, I noticed the problem.
I got stuck in this complicated situation. Help me out, I will be grateful.
Thanks.


text:
Adding 'Subscriptions' as default page in YouTube app
I use YouTube a lot in my phone, and specific in what I watch. I control this mainly using 'subscribing' channels what I really wanted to watch.
Now the problem is YouTube app has it's own default page called 'Home' which I totally hate it since it pollutes the feed by adding their own 'suggested' videos and I'm lost into videos that I wouldn't have watched otherwise.
Is there a way/app to set 'Subscription' page as the default?
Or is it possible to create a deep-link into my desktop so that that page opens directly !?
Or what are the better alternate to the official YouTube app ?

That might be possible: some launchers (e.g. Apex) offer to browse activities an app offers, and there are also stand-alone apps to do so (see my answer here. You then could create a shortcut to that activity (icon on the homescreen to launch directly into that activity).

Good idea @Izzy surprisingly Youtube has not listed that page as an activity.

That's nasty (but was worth a try). Afraid in this case chances are close to zero. Maybe trying an alternative YT player?

I installed the Automate app and created a new flow which I named "YouTube Launcher":

For the "Flow beginning" step, choose the option to "Install from home screen shortcut". Additionally, you can hide the official YouTube app from your app drawer so that you do not accidentally revert to old habits.
Add an "App Start" step and choose the YouTube app as the package.
Add a "Delay" step for 1 second.
Add an "Interact Touch" step and set the Screen X0 value to 50% and the Screen Y0 step to 90%. This step simulates tapping the subscriptions tab.

From there, each time to tap the new home screen shortcut the YouTube app will launch and automagically navigate to the Subscriptions tab.

I should try this for sure, so far I ended up using Kiwi browser with uBlock Origin, so that it blocks ads as well. And I added a homescreen shortcut directly to subscription page. Watching YT in browser is not that bad, and I get background play option for free.

If you tap long on the Youtube shortcut icon, then some options are appear in a popup list including Subscriptions.

If you tap long on any of these options, then you can drag it and drop somewhere on your Home screen for make a shortcut for that.
You can use this trick for avoid the Home screen on your Youtube app, but it works with other apps too.
Note: it worked for me on Android 9 with Samsung One UI 1.0, but it could work on other versions too.

Just an additional note, the feature is known as "app shortcut" and should generally be available since Android 7.1.


text:
How can I change the default browser on Xiaomi Mi Max phones?
How can I setup in my phone (Android 7 mimax 2) in way that every link or pop-up will be opened by chrome.
In the past I was able to choose how to open. Now the called "browser" browser only does it

@Rahul Hôpital thanks so much You can make it an answer and I'll approve it

MIUI 9
Go to Settings-> Installed Apps. On top you have three dots, tap on that three dots will pop up a menu, select Default app. Under browser part, set Chrome as default. After this operation, every link you open will be loaded in Chrome browser.
MIUI 8
Go to installed apps as described above. While when you are in Installed apps, you can see an icon written with Defaults. Tap on it, and set required.
Note: MIUI is the user interface of Xiaomi devices. MIUI 9 is the latest now.

In the mi max 3 with android version 9 PKQ1.181007.001 there is not "installed apps on the setting"

Please mention your current Miui version


text:
How to auto-answer video calls for telepresence/baby monitor/pet cam?
I would like to leave a tablet on my shelf and be able to video call into it while away and talk/hear/see my home without anyone necessarily being there, just to be able to check in. I have looked for auto-answer settings in Skype and Hangouts.
The situation is that I have a baby I'm going to leave in my home with her grandmother, and other sitters and relatives, and I don't want to have to teach them except to say that I'll check in via video sometimes. This way I shouldn't ever disturb the peace with phone ringtone sounds, nor have to wait for someone to pick up, nor have to wonder why they didn't pick up.
Skype has auto-answer, but it doesn't turn on video from the receiver. What else can I try? I haven't installed everything in the Play store…

Cloud camera solution
TL;DR Use SeeCiTV to use a second device as a remote camera.
Assuming your device is always going to be plugged in and connected to the Internet...
You can use the app SeeCiTV on the Play Store in order to always be able to check on the camera on your device. There are several apps which accomplish this, but I recommend this app as its interface seems easy to use (unlike the IP Webcam solution posted below).
This method is secured using your Google account which should already be set up with your phones, with the addition of being able to add Trusted Users if you want to give other accounts access to that camera.
One potential downside to this is that you can only access your new "home camera" on another phone or tablet, as there is currently no way to view it from a PC (unless you have a mobile device emulator). While SeeCiTV is great in terms of security and efficiency (the device screen and camera is turned off until you want to monitor it), let's say you need to be able to access it from any device on the Internet, then you'd need a different app like the next solution...
TeamViewer solution
TL;DR Use TeamViewer QuickSupport to answer VoIP calls.
This is another handy solution because you will not need to keep your remote screen on at all times (unlike the next few solutions). This supports most devices, but you can check the supported manufacturers list to make sure your device will be supported.
Download and install TeamViewer QuickSupport on the Play Store and set up a TeamViewer account from the app. Now download the TeamViewer control app on the Play Store on both the remote device (the device you will control) and the host device (the device from which you will he controlling your remote device).
Now you will need to install a manufacturer-specific add-in for QuickSupport, which the app should prompt you to install when you first open it. After you install the add-in, sign into your TeamViewer account on both devices. Then, add your remote device's ID (given by the QuickSupport app) to your list of account devices. Then, you'll be able to connect to that device any time and answer any incoming calls that you need (or you could start the call from the remote device).
IP Webcam solution
TL;DR Please use the Cloud camera solution unless you know what you're doing here.
If you need to have access to this device from a PC, and you can't use a mobile device or desktop emulator, then you can use an app like IP Webcam on the Play Store in order to constantly stream the camera data to the Internet.
You'd have to set up your remote network's ports and other settings to work with IP Webcam. The steps are walked through in the app, but
Why do I recommend the Cloud camera solution instead of this one?
For starters, it's potentially much less secure. SeeCiTV uses a Google account for authentication, but IP Webcam has its own form of authentication. Since you'd be connecting to your own remote IP, it's possible that your credentials, when you log in, will be transferred insecurely over the network. While IP Webcam may encrypt this information before transferring, you can avoid exchanging your camera stream and passwords over a non-SSL-secured connection if you use the Cloud camera solution instead. Even if you use a different password for this, it is much easier for attackers be able to gain access to your remote camera. And, yes, they could watch your baby for you, but maybe you should leave that task to yourself and your family.
It's also far less convenient to set up and to access the IP Webcam. IP Webcam will require your screen and camera to be active at all times (which will affect device life).
Skype solution
TL;DR If you need 2-way comms, use Skype
If it's necessary to have two-way communication between your device and the remote device, you could set up a Skype group between 3 devices: the remote tablet, a PC or another old device, and the device you want to use to video call. First, you'll need to install Skype on all of the devices. You can use these installers: Skype for Android or Skype for desktop. Start a Skype group between the devices, using a different Skype account for each device. Start a group call, and you will need to answer on the tablet and PC/device, then start the video on the remote tablet. Now you can connect to the group call whenever you want, from a third device. You can even share your own video feed from your third device. Just make sure your Internet is stable and that the call remains on at least 2 devices at all times.

Thanks @LyricWulf, but this really isn't auto-answering. The tablet at home would have to remain on, and plugged in, the whole time. The battery would run down quickly. That said, if I can't find a better solution, I may have to settle for something like this.

Yes, it would have to remain plugged in, but I can imagine why no one has made a service where you can initiate a two-way video call anytime with any device that you register. Think of all the misuse that would have... it's a pretty hefty privacy concern, in my opinion. Sorry I could not help you find a more suitable solution.

Though as a baby monitor or pet cam (as mentioned in the question), I would imagine that you leave the device mounted or propped up at a stationary location, so it should not be a big problem to leave it attached to a charger if it is going to just stay in one place.

Here is my proven/tested solution for the same/similar situation.

You need to have two devices - a) yr smart phone b) any standard tab
Have Skype setup in BOTH the devices.
Specifically setup "auto call receiving - ON" for the Skype on the tab.

Now you call whenever you want, the Skype on the tab (at your home with baby + Gramma) will automatically wake up and receive the call without any touch from anyone, after a few rings!
I used this method to connect (or rather self-appear) in front of my 88 year father who is battling with 2-3rd stage of dementia. The tab got to be on power ON mode (connected to a socket) 24 x 7. That is one little but important thing you got to keep it mind. And avoid longer video chats to keep the tab from over heating. Just a word of caution.


text:
Unable to change default launcher
I have Lenovo k5 smartphone with Lollipop 5.1.1.
As stock "Lenovo Launcher" sucks, I installed Nova Launcher and set it as default.
Unfortunatelly, after each restart (or even without restart, after few hours) the default launcher changes to stock "Lenovo launcher".
Is that a way to permanent change?


text:
Disable Google Apps in MIUI 9 and MIUI 9.5
My friend has two Mi phones Redmi Note4 and Mi Max2.
And recently I updated both; Redmi Note 4 to MIUI 9 and Mi Max2 to MIUI 9.5.
To disable Google Apps like Chrome, Play Music, Play Movies & TV, etc in both I gone through the link. The steps explained the link is for MIUI 8.0. That's why Google Apps couldn't be disabled.
Please let me know how to disable Google Apps in MIUI 9 and MIUI 9.5?
With Regards
TekQ

For system apps(built-in eg: chrome, google etc), in settings you have two options, disable and force stop. For user apps(installed from playstore), you have uninstall and force stop. These settings are from Stock Android 8.0 Oreo. MIUI 9 on these devices will be running Android 7.0 Nougat and may have above options in settings->Installed apps.

Check this for detailed step to disable


text:
Is there an API for google's Find My Device, specifically the ringer?
My mom loses her phone constantly, and it's a pain to log out of my password manager, log into hers, log into her google account, and ring the phone with Find My Device. Is there an API somewhere so I can do this automatically?


text:
Limit Access to Safe Mode, Android 8.0+
I'm a parent, using an accountability app (MMGuardian) to limit access to certain games and apps on a Nexus 5X. The child phone is running Android 8.1.0. MMGuardian can't stop a child from rebooting into safe mode for 7.0+, and the child using this phone has figured that out.
I'm looking for a solution that either holds the child accountable, or prevents access to safe mode altogether. Here are ideas I've thought of:

Custom lock screen that sends the parent pin to the OS when the child pin is entered. When rebooted in safe mode, lock screen wouldn't start and the child wouldn't know the parent pin.
Some kind of app that sends an sms to the parent phone when the child phone reboots. If possible, include whether or not the child phone was previously in safe mode. (Nine Mail app turns off all sync functionality if the phone was rebooted in safe mode. How does it know!?)

Unfortunately, since I'm not an android developer I don't know if apps like that exist or are possible to write.
Does anyone have suggestions for apps I can install or settings I can change that would either
A) Prevent starting in safe mode.
OR
B) Notify me, when the child phone has started in safe mode?

you can use any number of kiosk apps to do this. I'm really not sure what they require or how they work, but they're designed for companies to lock down features for employees etc. as such they're somewhat spendy for Android apps, but I did see at least one for $30/year including tech support.
sorry I can't give you more info, but look in the Play Store for "kiosk" and take a look. I'm currently researching the same thing.


text:
Why does this character ⚫ crash Whatsapp?
I received a WhatsApp forward that reads:

If you touch theblack point then your whatsapp will hang
<⚫>           ereh-hcuot-t

Surprisingly on touching the black dot, it crashes WhatsApp (The whole screen hangs and we have to wait till WhatsApp closes). Is there any reason for this crashing behaviour? (Attaching screenshots for reference)

This crashed on my Android (8.1) Phone. My friend who uses an iPhone claims that it doesn't crash on his phone. (I hope this is the right place to post the question)

Same message is also causing hang/crash in Signal messenger

As others said, there are ~2000 zero-width or 'invisible' unicode characters in that message. These characters are the ones which instruct the text renderer whether to display the text left-to-right or right-to-left. When you tap on the message, the text renderer tries to work out which character you are tapping on. As there are a lot of characters with conflicting instructions, the app hangs up until it can make a decision.
There is this very elegant and informative video by Tom Scott on youtube that explains the problem better than I ever can: https://youtu.be/jC4NNUYIIdM

that message have more than 2000 no displayable characters and for be that long message make a crash if you hit wait on the message it came back to normal just give it time to process the long long long string

The message have a lot of (about 2000) invisible characters called "left-to-right makr" (It is used to set the way adjacent characters are grouped with respect to text direction)

It just bunch of letters and numbers hidden behind that ball and bugged so someone who touches it, it will try to open the whole message but cant hence as a result it crashes the app..


text:
Android data disappeared
I got an Android Tablet (Samsung SM-T800). I recently went into Download Mode (holding down some keys during startup), just to check if options for factory reset are available. I canceled out of Download Mode and booted up normal. Now all my photos and documents are gone. Only 2 of over 100 pics are still there. All the apps and settings are still there. I didn't do a factory reset, so I don't understand why my photos are gone. If I plug the tablet into my PC, the space that was once used by the photos is still occupied. I guess, they are still there, but for some reason they are invisible. I tried some data recovery apps from the Google Play Store to no avail. The data is stored on the internal SD card. Can anybody tell me, how I could get my data back?

Maybe the files are still there but the media database is corrupt (a lot of apps just show the media database to locate files)? Use a file manager app to check what is really left in the file-system.

Are there any file managers you would recommend me to use, that dont use the media database? I dont wanna install too many apps from the Google Play Store in fear of overwriting my files.

Any file manager will do all file manager I know use the file-system and not the media database as information source.


text:
Does a broken screen affect the resolution of an android device?
I have a Samsung Galaxy Note 3 which screen was recently broken. I am trying to use the phone with a third party app on my PC. I tried vysor but the screen resolution is terrible. I also tried the Connect app in windows 10 and I am facing the same problem again. Here are photos of what I mean:
Connect app screen

Vysor Screen

Is there anyway I can go around the issue?

You should [edit] your question and improve the title, unless you'd take "no" as a valid answer worth 100 of your reputation :)

How exactly is your screen broken? Is it just the glass, or is the damage more significant?

The glass is broken and it seems a little bit lifted upwards. That's all.

I'm a big fan of Vysor, especially for texting with my keyboard. Have you tried messing around in the resolution settings? Click the gear icon in the upper right hand corner of your Vysor screenshot to see this menu:

There could also be some strange stuff going on with your device. You need to enable USB Debugging from the Developer Options on your Android, which might be tricky if your phone screen is completely broken and unusable. Here's a HowToGeek link on getting it enabled.
Finally, Windows users need to download some special drivers to get it to work. Download link: http://download.clockworkmod.com/test/UniversalAdbDriverSetup.msi
All of this info comes from the Vysor page on the Play Store, and some quick Googling.
If you've tried all of this without any luck, we'll need more info about how broken your screen is to help further.
EDIT: I don't have enough reputation to comment below, but I can respond here. How exactly is your screen broken? Is it merely cracked, or is it totally unusable?

Thanks for your answer. I am not a vysor pro user, so I would be grateful if you could suggest another app that could do the job. Also, the screen resolution is fine for any other device, but for my phone it is terrible.

It does not seem to be a problem with vyosr. I tried the connect app and I have the same problem. I also tried connecting the phone with the TV but nothing new.


text:
Sync apps from specific device?
My new phone got synced to my table instead of my old phone.  It didn't list my old phone as an option to sync from.
Is there a way to sync my installed apps and data from my old phone?
Getting the screen layouts synced would be nice too.
All the articles I can find are just "sync to Google", but not to sync to a particular device.
If it matters, the old phone still (mostly) works.

Do you use the same Google account on all devices (old phone, new phone and tablet)?

I have the same personal account everywhere, but some devices also have a business account.  Why would this matter?

It matters because backups are tied to a specific Google account. And you can only select one backup account at a time.

Check to make sure that you have Google backing up your data on the phone you want to sync from. On your old phone, navigate to Settings > Backup & reset > (Google Backup) and ensure that Back up my data is On. Also ensure that your Backup account is the account which you're logging into on your new phone.
After your old phone syncs (which may take some time, but it will let you know when), you should be able to see your phone on your new device as you are setting it up. You may need to factory reset your new phone in order to see the list of Google backup devices.

The old phone was backed up.  However, it wasn't shown in the list as I brought up the new phone.  I'm not about to reset the new phone and start over.

You should still confirm the settings on your old phone to make sure that it has the backup was set up properly. Also, there is currently no way to restore from a device backup without factory resetting your phone.


text:
How to limit charging to a user defined limit?
My UleFone Armor 2 has a 4700mAh battery and I would like to limit the charging to 60% to reduce battery aging. The batteries in most of the phones are not user-replaceable and I am worried that a factory/service battery replacement might affect water resistance negatively.
How can I limit the charging to 60%? (But not limiting charging speed. I love fast charging.)
Lenovo ThinkPads have a built-in feature that does this, called “battery preservation mode”.

(One way is an outlet timer switch, but it would be great if the phone could limit it itself.)

I have always charged my phones to 100, and even kept them plugged in overnight all year long after each day's use, and so far none of them had any battery issues.

@NVZ How old is the battery? And which phones are they? (to find out the wattage and battery capacity)

I've done this since my Nokia N73, N82, Nokia 6233, Nokia E52, Samsung Galaxy W, many years ago.. then I have done so for all my phones including Samsung Galaxy S4, Duos, HTC 728, OnePlus One, 3T, Nokia 8, 5.1 Plus, etc to name some.

@NVZ That merely proves that your battery lifespan has been ok for you, not that it couldn't have been better if you used more optimal charge cycles. It is well known that doing full cycles (e.g. 0 to 100%) will wear out your battery faster than e.g. 30% to 80% cycles. All batteries will degrade over time, and you have had issues with all of those batteries, just not serious enough that you noticed or cared. Also typically a battery will last around 500 cycles before you start to notice anything.

@JBentley I just wish manufacturers could replace non-removable batteries without loss of water resistance.

@JBentley I'm aware, thanks. Another fact is, keeping it plugged in overnight does not have a significantly harmful effect on the battery. It is however better in the long run to unplug it if fully charged.

@NVZ Do you have a citation / source for that? What I've read is the opposite (see here for example). Charging every time to 100% can half or worse your lifespan, depending on which lower cutoff point you choose.

@JBentley I would not mind that lifespan so much if batteries were replaceable. But then, Apple intoxicated the mobile phone market with their inferior technology.

@neverMind9 Yes, I completely agree. It's not just Apple. For a long time I avoided upgrading from the now very obsolete Samsung Note 4, because it was the last in the series with a replaceable battery. It's nice to be able to get a 100% capacity battery every year or so for very little expense. But phone manufacturers want you to swap phones every couple of years rather than refurbish existing ones. The problem with NVZ's approach is that the higher end of the phone market is now very expensive, and I don't want to replace a £1000 phone every 2 years just for the battery.

@JBentley The Note 4 still works well in 2019, despite it is nearly 5 years old, in our case, it works as if it were new. Even the Note 3 from 2013 does fine (and has a lot of functionality that newer phones lack). But battery age has always been a nasty thing for non-removable batteries. When that battery is dead, the support service might be able to replace it, but whether they preserve water resistance and whether I will get my phone back intact (if at all) is not guaranteed. I have always avoided charging over 70% for that reason. I have battery-gerascophobia.

@JBentley But fast charging is so useful that I am ready to trade in a bit of battery life to enjoy the pleasure of watching the battery percentage indicator shoot up in a very short amount of time. I really enjoy fast charging. But the problem is: When the battery ag*s, the maximum terminal voltage of ~4.35V is reached at lower battery levels already (i.e. 45% instead of 65%) at full charging speed, so the charging current starts decreasing earlier already. Before reaching the 45%, the charging current is the same to avoid overcurrent thermal runaway, despite the battery voltage is below 4.3V

@NVZ, you are factually incorrect.  A battery can lose 20% of its life in less than a year by charging at 100% overnight.  This is by definition considered significant in the technical sense.  Probably what you mean is that you don't notice a difference, which is entirely subjective.  [1] https://batteryuniversity.com/learn/article/how_to_prolong_lithium_based_batteries
[4] https://www.macworld.com/article/3408336/ios-13s-new-optimized-battery-charging-feature-explained.html
[5] https://www.howtogeek.com/423451/how-ios-13-will-protect-your-iphones-battery-by-charging-to-80/

There now is a hardware+app solution for that, it's called Chargie. https://chargie.org
Basically, Chargie is a Bluetooth switch that is linked to an app on your phone. You set the desired level of charging, the app runs in the background and stops the charge at the percentage you set.
*disclosure: I am the CEO of Lighty Electronics, we have developed this solution and this isn't meant to be a spammy post with a link, but rather a very relevant solution to this issue. As far as I know, there are no other manufacturers of such devices.

No USB-C model?

I was all set to purchase one but shipping is $16.50, the device itself is only $23.00 (with the current sale.) Can we get another shipping option? All I'm given is DHL Express shipping, I don't need express.

@Gibolt, just use a USB C female to to USB A male adapter. My Google Pixel 5 even came with one in the box. Then, you can plug in a USB C charge cable to the adapter, and the adapter into the Chargie USB A female output.

Many ways - all of course, need
root. Without root, it's not possible and you can only  be notified either by automation or using an app as suggested in Chang's answer

Battery Charge Limit from Play Store. If it doesn't work directly, look for help in the XDA app thread. It doesn't trip safety net if you are using Magisk. I use this app currently (Bonus, it's open source and on f-droid)

Magisk Charging Switch Magisk module is also well spoken of.

My Charging Controller is another option. I recall seeing it as Magisk module but not listed now

Above modules not tried by me

If none of these work or you want to automate it yourself, some pointers in my answer here Automatically limit (stop) battery charging at a given percentage

Edit: Advanced Charging Control (acc) Magisk Module is a very versatile module with an associated front end app, which allows you to create profiles and even run profiles on schedule
It allows the phone to charge up to a certain point and then be powered by USB only.  For example, you set the cut off at 80%,beyond 80% it doesn't charge the battery but draws a low current to keep the phone running. So when you disconnect charging, your phone is still at 80%! This feature requires to be supported by kernel though. I am using this currently on my One Plus 7 with Kirisakura kernel. For details see this Don't charge the battery but use connected power to run the phone

Do you know of any good solutions that use external hardware, like a Sonoff device to cut power?  Along the line of chargie.org, but open source.

@jdk1.0 Sorry but no Open source solutions I know of. If you do get to know, please make that an answer. Thanks

AccuBattery can notify you when the battery charge reaches a certain level. It won't stop the charging, unfortunately, but it's still worth a try. :)

Okay it's a while ago this thread was started ... ;-) The app you mentioned here has a big drawback. If you keep your phone plugged in over night you will be kicked out of the bed because of the alarm. Makes more sense to have a device that cuts off the power if a specific charging limit has been reached. I was searching for such an device for months. Finally I found the chargie app with its device and it does a great job since I started using it. I'm even thinking about developing an device that can even more than that und can change more that one phone at the same time.

My solution is to just use a CountDowntimer on the power outlet, set at 1:20 for me. One hit on the CD button to start the power (ON), and after 1:20 it's OFF again which will be at about 80% charge.
I use this:
https://www.clasohlson.com/se/Digitalt-kopplingsur/32-8618
Today you can buy a smart power outlet controlled with an app. It shouldn't be long until that app can turn of the power outlet charging the cellphone when it reaches 60%.

If your phone is rooted, do prefer an opensource Advanced Charging Controller module to flash either from Magisk or Twrp or any root solution u have choose. Here is the Github link for all details.
My experience in this module is, I am using this on my Oneplus 5 for about a year now, it doesn't disappoint me. It creates a charging loop. You can change it's default preference by typing acc commands. 80% is the default stopping point. And there is heating machining where its charge/discharge on & off if ur phone is expected to reach a peak point, which is a nice way to tackle the heating issue which is generally seen while charging.
If any problem occurs u can ask him on telegram or create an issue on Github.


text:
Does Samsung profile sharing work on other Android devices?
The Contacts app on Samsung Android phones has a feature called profile sharing. If you enable it, it lets you share your name, phone number and profile picture with all your contacts. Your contacts will now be able to see your profile picture in their Contacts app, presumably, similarly to WhatsApp or Signal.
Does this feature in Samsung Contacts app work on other phones? Is there a way to get it to work on other phones? Do other brands have similar functionality?


text:
Problems installing Lineage on Moto G5 w TWRP
TWRP is fine.
I have lineage-15.1-20180415-UNOFFICIAL-cedric.zip in the Downloads folder on the 'phone.
On attempting to flash this, TWRP fails with: "Updater process ended with ERROR: 255".
Advice elsewhere suggested unzipping the package, then removing the first 2 lines of file at META_INF>Com>Google>Android>UpdaterScript. These refer to the 'Cedric' device name - but I have no real idea what they mean.....
I did this, but as I'm on a mac, could not follow the instructions relating to re-creating the archive as they were Windows specific ('Add to rar' was suggested). So I tried straight zip archiving.
Attempting to flash the archive thus created, TWRP now fails with : "Invalid zip file format!".
Would be grateful for advice on how to create the appropriate file format using a mac.
I have an app called 'Keka', which offers as options 7z, Zip, Tar, Gzip, Bzip2. Are any of these appropriate?
Thank you!

I installed yesterday with latest TWRP (3.2.1-0) and same lineage image as you (lineage-15.1-20180415-UNOFFICIAL-cedric.zip) and got the same error.
Try again and after failing, in TWRP go to Advanced -> Copy Log. Get the log file in your computer (adb pull /sdcard/recovery.log, you may need to change location of the log file) and open it with any editor or just cat recovery.log.
If you see a line saying:
E:Can't execute '/tmp/updater': Exec format error

Then it probably is due to having the bad TWRP. You need the 64 bits one instead of the regular one. You can get it from https://androidfilehost.com/?w=files&flid=236353. Flash this new TWRP and then Lineageos and optionally gapps.
BTW I didn't need to mess with the zip image, I used the downloaded one without any modifications.

64bit TWRP was indeed the requirement. Took me some while to get it sorted though - TWRP is not informative about 32 / 64 bit status of builds. Got the successful TWRP from here: https://androidfilehost.com/?fid=673956719939821589

@Dilgreen Make sure to accept the answer if it helped you


text:
Can i recover data from a Nandroid Backup without the original device?
I'd like to start making scheduled backups to my rooted OnePlus 3T (Oxygen OS 5.0.1) in order to prevent the loss of data from any reason that could occur.
I want to save everything: the entire content of /sdcard and the apps+data. I know doing a Nandroid Backup with TWRP is the best way to make a complete backup of an Android device quickly, but i have a question:
Is it possible to recover data without the original device? If i had a totally new device, would it be possible to extract some specific data from the backup? (For example, read and extract the /sdcard/download directory from the backup, or also extract the data from a given app)

That would indeed be possible. There are several apps which are able to extract parts of a Nandroid backup, e.g. Titanium Backup or ROM Toolbox.
Apart from that, depending on the format used by your Nandroid backup, you can either mount them as loop device (disk images) or unpack them (tarballs) to invesigate/access all contents.
For further details, I'd recommend a look at our nandroid tag-wiki – and especially follow up to:

Restore only part of nandroid image
Extract App Data from Nandroid / CWM Backup

Nandroid backup is nothing more that just images of partitions of your phone: /system, /boot, /data, /cache. It is extractable by any decent archiver that recognizes img images, e.g. 7zip.
I done this many times.


text:
where is android keyboard app located?
I uninstalled the stock AOSP keyboard from my android cyanogenmod 11 I have the ROM zip file so I'm fetching the keyboard to put it back but I don't know where it is, it's neither under /system/app nor under /system/priv-app
rahman@SISYPHUS:~/Downloads/lineage> ls -l system/app/
total 104076
-rw-r--r-- 1 rahman users  1686064 Feb 29  2008 Apollo.apk
-rw-r--r-- 1 rahman users    33302 Feb 29  2008 BasicDreams.apk
-rw-r--r-- 1 rahman users  2003305 Feb 29  2008 Bluetooth.apk
-rw-r--r-- 1 rahman users   295592 Feb 29  2008 BluetoothExt.apk
-rw-r--r-- 1 rahman users  3229555 Feb 29  2008 Browser.apk
-rw-r--r-- 1 rahman users   980865 Feb 29  2008 Calculator.apk
-rw-r--r-- 1 rahman users  2039531 Feb 29  2008 Calendar.apk
-rw-r--r-- 1 rahman users  4186076 Feb 29  2008 Camera2.apk
-rw-r--r-- 1 rahman users   455626 Feb 29  2008 CellBroadcastReceiver.apk
-rw-r--r-- 1 rahman users   164413 Feb 29  2008 CertInstaller.apk
-rw-r--r-- 1 rahman users  2433831 Feb 29  2008 CMFileManager.apk
-rw-r--r-- 1 rahman users   311660 Feb 29  2008 CMHome.apk
-rw-r--r-- 1 rahman users  7898628 Feb 29  2008 CMWallpapers.apk
-rw-r--r-- 1 rahman users  2963113 Feb 29  2008 DeskClock.apk
-rw-r--r-- 1 rahman users   111050 Feb 29  2008 Development.apk
-rw-r--r-- 1 rahman users   427255 Feb 29  2008 DocumentsUI.apk
-rw-r--r-- 1 rahman users   238325 Feb 29  2008 DownloadProviderUi.apk
-rw-r--r-- 1 rahman users   733567 Feb 29  2008 DSPManager.apk
-rw-r--r-- 1 rahman users  5194472 Feb 29  2008 Email.apk
-rw-r--r-- 1 rahman users  1174970 Feb 29  2008 Exchange2.apk
-rw-r--r-- 1 rahman users   279206 Feb 29  2008 Galaxy4.apk
-rw-r--r-- 1 rahman users  6223567 Feb 29  2008 Gallery2.apk
-rw-rw-r-- 1 rahman users   206402 Feb 29  2008 GoogleContactsSyncAdapter.apk
-rw-r--r-- 1 rahman users    61557 Feb 29  2008 HoloSpiralWallpaper.apk
-rw-r--r-- 1 rahman users    12165 Feb 29  2008 HTMLViewer.apk
-rw-r--r-- 1 rahman users    10448 Feb 29  2008 InCallUI.apk
-rw-r--r-- 1 rahman users    74638 Feb 29  2008 KeyChain.apk
-rw-r--r-- 1 rahman users 42780317 Feb 29  2008 LatinIME.apk
-rw-r--r-- 1 rahman users  1765803 Feb 29  2008 LiveWallpapers.apk
-rw-r--r-- 1 rahman users   180192 Feb 29  2008 LiveWallpapersPicker.apk
-rw-r--r-- 1 rahman users  8629786 Feb 29  2008 LockClock.apk
-rw-r--r-- 1 rahman users   239931 Feb 29  2008 MagicSmokeWallpapers.apk
-rw-r--r-- 1 rahman users    90493 Feb 29  2008 NoiseField.apk
-rw-r--r-- 1 rahman users   391583 Feb 29  2008 PackageInstaller.apk
-rw-r--r-- 1 rahman users     5634 Feb 29  2008 PacProcessor.apk
-rw-r--r-- 1 rahman users   105916 Feb 29  2008 PhaseBeam.apk
-rw-r--r-- 1 rahman users   803882 Feb 29  2008 PhotoPhase.apk
-rw-r--r-- 1 rahman users   478492 Feb 29  2008 PhotoTable.apk
-rw-r--r-- 1 rahman users    18151 Feb 29  2008 PicoTts.apk
-rw-r--r-- 1 rahman users   241796 Feb 29  2008 PrintSpooler.apk
-rw-r--r-- 1 rahman users     3691 Feb 29  2008 Provision.apk
-rw-r--r-- 1 rahman users   170124 Feb 29  2008 SoundRecorder.apk
-rw-r--r-- 1 rahman users   112484 Feb 29  2008 Stk.apk
-rw-r--r-- 1 rahman users   100002 Feb 29  2008 TelephonyProvider.apk
-rw-r--r-- 1 rahman users   564672 Feb 29  2008 Term.apk
-rw-r--r-- 1 rahman users   189585 Feb 29  2008 Torch.apk
-rw-r--r-- 1 rahman users    15787 Feb 29  2008 UserDictionaryProvider.apk
-rw-r--r-- 1 rahman users  5704511 Feb 29  2008 VideoEditor.apk
-rw-r--r-- 1 rahman users   207362 Feb 29  2008 VisualizationWallpapers.apk
-rw-r--r-- 1 rahman users   224525 Feb 29  2008 VoicePlus.apk
-rw-r--r-- 1 rahman users     7116 Feb 29  2008 WAPPushManager.apk
rahman@SISYPHUS:~/Downloads/lineage> ls -l system/priv-app/
total 71160
-rw-r--r-- 1 rahman users   141551 Feb 29  2008 BackupRestoreConfirmation.apk
-rw-rw-r-- 1 rahman users   233655 Feb 29  2008 CalendarProvider.apk
-rw-r--r-- 1 rahman users  1490703 Feb 29  2008 CMAccount.apk
-rw-r--r-- 1 rahman users   299723 Feb 29  2008 CMUpdater.apk
-rw-r--r-- 1 rahman users  3178247 Feb 29  2008 Contacts.apk
-rw-r--r-- 1 rahman users   429926 Feb 29  2008 ContactsProvider.apk
-rw-r--r-- 1 rahman users    20378 Feb 29  2008 DefaultContainerService.apk
-rw-r--r-- 1 rahman users  4276606 Feb 29  2008 Dialer.apk
-rw-r--r-- 1 rahman users   504601 Feb 29  2008 DownloadProvider.apk
-rw-r--r-- 1 rahman users    26999 Feb 29  2008 ExternalStorageProvider.apk
-rw-r--r-- 1 rahman users    14793 Feb 29  2008 FusedLocation.apk
-rw-rw-r-- 1 rahman users   127421 Feb 29  2008 GoogleBackupTransport.apk
-rw-rw-r-- 1 rahman users   303583 Feb 29  2008 GoogleFeedback.apk
-rw-rw-r-- 1 rahman users  5714918 Feb 29  2008 GoogleLoginService.apk
-rw-rw-r-- 1 rahman users   129466 Feb 29  2008 GooglePartnerSetup.apk
-rw-rw-r-- 1 rahman users  2358561 Feb 29  2008 GoogleServicesFramework.apk
-rw-r--r-- 1 rahman users   163176 Feb 29  2008 InputDevices.apk
-rw-r--r-- 1 rahman users  2306822 Feb 29  2008 Keyguard.apk
-rw-r--r-- 1 rahman users   131631 Feb 29  2008 MediaProvider.apk
-rw-r--r-- 1 rahman users  3065387 Feb 29  2008 Mms.apk
-rw-r--r-- 1 rahman users     5691 Feb 29  2008 OneTimeInitializer.apk
-rw-rw-r-- 1 rahman users  6126834 Feb 29  2008 Phonesky.apk
-rw-rw-r-- 1 rahman users  8536422 Feb 29  2008 PrebuiltGmsCore.apk
-rw-r--r-- 1 rahman users     8179 Feb 29  2008 ProxyHandler.apk
-rw-r--r-- 1 rahman users 19786541 Feb 29  2008 Settings.apk
-rw-r--r-- 1 rahman users   138839 Feb 29  2008 SettingsProvider.apk
-rw-rw-r-- 1 rahman users  1533478 Feb 29  2008 SetupWizard.apk
-rw-r--r-- 1 rahman users     6889 Feb 29  2008 SharedStorageBackup.apk
-rw-r--r-- 1 rahman users    56582 Feb 29  2008 Shell.apk
-rw-r--r-- 1 rahman users  2425108 Feb 29  2008 SystemUI.apk
-rw-r--r-- 1 rahman users  4068193 Feb 29  2008 TeleService.apk
-rw-r--r-- 1 rahman users  2560728 Feb 29  2008 ThemeChooser.apk
-rw-r--r-- 1 rahman users    27912 Feb 29  2008 ThemesProvider.apk
-rw-r--r-- 1 rahman users  2223276 Feb 29  2008 Trebuchet.apk
-rw-r--r-- 1 rahman users   129746 Feb 29  2008 VoiceDialer.apk
-rw-r--r-- 1 rahman users    63231 Feb 29  2008 VpnDialogs.apk
-rw-r--r-- 1 rahman users   176798 Feb 29  2008 WallpaperCropper.apk

The default AOSP keyboard is /system/app/LatinIME.apk. IME is an acronym for Input Method Editor.