• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Strings not sending proprerly over Bluetooth [Android App]

I've been making an Android app that connects two devices and sends data in form of strings between them. The receiving side doesn't get the right message, for example (i'm sending int -> String.valueOf) if I send 62 it prints out only 6..only the first character always. What's the problem? Here's the recieving side read code:

Code:
  private Runnable reader = new Runnable() {
    public void run() {

        android.util.Log.e("TrackingFlow", "ServerReader");
        try {

            is = socket.getInputStream();
            os = new OutputStreamWriter(socket.getOutputStream());

            int bufferSize = 1024;
            int bytesRead = -1;
            byte[] buffer = new byte[bufferSize];
            //Keep reading the messages while connection is open...
            while(READ){
                final StringBuilder sb = new StringBuilder();
                bytesRead = is.read(buffer);
                if (bytesRead != -1) {
                    String result = "";
                    while ((bytesRead == bufferSize) && (buffer[bufferSize-1] != 0)){

                        result = new String(buffer, 0, bytesRead - 1);
                        bytesRead = is.read(buffer);
                    }
                    result = result + new String(buffer, 0, bytesRead - 1);
                    sb.append(result);
                }
                android.util.Log.e("TrackingFlow", "Read: " + sb.toString());
                //Show message on UIThread
                runOnUiThread(new Runnable() {
                    [USER=1021285]@override[/USER]
                    public void run() {
                        Toast.makeText(BluetoothServer.this, sb.toString() , Toast.LENGTH_LONG).show();
                    }
                });
            }
        } catch (IOException e) {e.printStackTrace();}
    }
};


And the sending side write code:

Code:
private Runnable writter = new Runnable() {

    [USER=1021285]@override[/USER]
    public void run() {

        if (WRITE) {
            try {
                android.util.Log.e("TrackingFlow", "Saljem: " + pomocni);
                os.write(pomocni);   //TODO preko temp u click listeneru poslati poziciju koja je stisnuta, upaliti WRITE prije tog
                os.flush();
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }

            WRITE = false;
        }
    }
};
 
Last edited:
Please put your code in [code][/code] as this makes it easier to read.

Do you see any exceptions in the Logcat output?
To start with, I wouldn't call e.printStackTrace(). Your sender code is probably throwing an exception, but the stack trace is going to standard output, and who knows where that ends up?

I would just log the Exception. Do the same with the receiver code.

Code:
Log.e(e.toString());

or in your catch block, just rethrow the exception, and let the system deal with it

Code:
throw e
 
Upvote 0
I edited the code as you said.

This is the recieving side logcat:

Code:
06-09 22:11:04.532 4563-4563/com.marijannovak.potapanjebrodovazavrsni E/TrackingFlow: Creating thread to start listening...
06-09 22:11:04.553 4563-4742/com.marijannovak.potapanjebrodovazavrsni W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
06-09 22:11:04.558 4563-4742/com.marijannovak.potapanjebrodovazavrsni E/TrackingFlow: Listening...
06-09 22:11:04.561 4563-4563/com.marijannovak.potapanjebrodovazavrsni I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@17b69fca time:16408377
06-09 22:11:18.580 4563-4742/com.marijannovak.potapanjebrodovazavrsni E/TrackingFlow: Socket accepted...
06-09 22:11:18.582 4563-4884/com.marijannovak.potapanjebrodovazavrsni E/TrackingFlow: ServerReader
06-09 22:11:32.379 4563-4884/com.marijannovak.potapanjebrodovazavrsni E/TrackingFlow: Read: 3

And the sending side:

Code:
06-09 22:15:14.473 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: hoder:android.app.IActivityManager$ContentProviderHolder@6f4d4db,provider,holder.Provider:android.content.ContentProviderProxy@b7b8b78
06-09 22:15:14.502 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: BIND_APPLICATION handled : 0 / AppBindData{appInfo=ApplicationInfo{d5e7ab6 com.marijannovak.potapanjebrodovazavrsni}}
06-09 22:15:14.505 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Handling launch of ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}}
06-09 22:15:14.529 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}}: app=android.app.Application@2ccf8c42, appName=com.marijannovak.potapanjebrodovazavrsni, pkg=com.marijannovak.potapanjebrodovazavrsni, comp={com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}, dir=/data/app/com.marijannovak.potapanjebrodovazavrsni-2/base.apk
06-09 22:15:14.968 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Performing resume of ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}}
06-09 22:15:14.969 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: ACT-AM_ON_RESUME_CALLED ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}}
06-09 22:15:14.969 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Resume ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}} started activity: false, hideForNow: false, finished: false
06-09 22:15:15.024 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Resuming ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}} with isForward=false
06-09 22:15:15.027 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Scheduling idle handler for ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}}
06-09 22:15:15.028 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: ACT-LAUNCH_ACTIVITY handled : 0 / ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}}
06-09 22:15:24.415 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: ACT-AM_ON_PAUSE_CALLED ActivityRecord{1961e3b7 token=android.os.BinderProxy@3899e724 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.Pocetni}}
06-09 22:15:24.423 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: ACT-PAUSE_ACTIVITY handled : 1 / android.os.BinderProxy@3899e724
06-09 22:15:24.424 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Handling launch of ActivityRecord{463e036 token=android.os.BinderProxy@2c9b1b37 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}}
06-09 22:15:24.425 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: ActivityRecord{463e036 token=android.os.BinderProxy@2c9b1b37 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}}: app=android.app.Application@2ccf8c42, appName=com.marijannovak.potapanjebrodovazavrsni, pkg=com.marijannovak.potapanjebrodovazavrsni, comp={com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}, dir=/data/app/com.marijannovak.potapanjebrodovazavrsni-2/base.apk
06-09 22:15:24.490 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Performing resume of ActivityRecord{463e036 token=android.os.BinderProxy@2c9b1b37 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}}
06-09 22:15:24.490 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: ACT-AM_ON_RESUME_CALLED ActivityRecord{463e036 token=android.os.BinderProxy@2c9b1b37 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}}
06-09 22:15:24.490 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Resume ActivityRecord{463e036 token=android.os.BinderProxy@2c9b1b37 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}} started activity: false, hideForNow: false, finished: false
06-09 22:15:24.510 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Resuming ActivityRecord{463e036 token=android.os.BinderProxy@2c9b1b37 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}} with isForward=true
06-09 22:15:24.512 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/ActivityThread: Scheduling idle handler for ActivityRecord{463e036 token=android.os.BinderProxy@2c9b1b37 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}}
06-09 22:15:24.513 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: ACT-LAUNCH_ACTIVITY handled : 0 / ActivityRecord{463e036 token=android.os.BinderProxy@2c9b1b37 {com.marijannovak.potapanjebrodovazavrsni/com.marijannovak.potapanjebrodovazavrsni.BluetoothClient}}
06-09 22:15:25.036 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/ActivityThread: ACT-DESTROY_ACTIVITY handled : 1 / android.os.BinderProxy@3899e724
06-09 22:15:30.636 19363-19515/com.marijannovak.potapanjebrodovazavrsni E/TrackingFlow: Spojio sam se
06-09 22:15:34.212 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/FeatureProxyBase: FeatureProxyBase class constructor
06-09 22:15:34.213 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/MultiWindow: MultiWindowProxy constructor.
06-09 22:15:34.213 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/FeatureProxyBase: getService(), serviceName = multiwindow_service_v1
06-09 22:15:34.236 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.272 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.283 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/SettingsInterface:  from settings cache , name = sound_effects_enabled , value = 0
06-09 22:15:34.342 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.357 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.369 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.382 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.413 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.430 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.448 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.467 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.484 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.501 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.518 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.533 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.727 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/FeatureProxyBase: FeatureProxyBase class constructor
06-09 22:15:34.727 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/MultiWindow: MultiWindowProxy constructor.
06-09 22:15:34.728 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/FeatureProxyBase: getService(), serviceName = multiwindow_service_v1
06-09 22:15:34.746 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/SettingsInterface:  from settings cache , name = sound_effects_enabled , value = 0
06-09 22:15:34.752 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:34.762 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/AbsListView: [OOM warning] total = 50, scrap = android.widget.ImageView{297693e8 V.ED.... ......I. 116,112-143,139}, position = 44, scrap width = 27, scrap height = 27, mViewTypeCount = 1, viewType = 0, this = android.widget.AbsListView$RecycleBin@a5307c5
06-09 22:15:34.763 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/AbsListView: [OOM warning] total = 100, scrap = android.widget.ImageView{20610b6 V.ED.... ......I. 116,252-143,279}, position = 94, scrap width = 27, scrap height = 27, mViewTypeCount = 1, viewType = 0, this = android.widget.AbsListView$RecycleBin@a5307c5
06-09 22:15:34.860 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/InputMethodManager: START INPUT: android.widget.GridView{2d03de07 VFED.VC. .F...... 25,100-313,379 #7f0f0056 app:id/client} ic=null tba=android.view.inputmethod.EditorInfo@21ce2f2a controlFlags=#100
06-09 22:15:34.866 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.504 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/FeatureProxyBase: FeatureProxyBase class constructor
06-09 22:15:35.504 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/MultiWindow: MultiWindowProxy constructor.
06-09 22:15:35.504 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/FeatureProxyBase: getService(), serviceName = multiwindow_service_v1
06-09 22:15:35.507 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/AbsListView: Touch down: touch mode = 0,mScrollY = 0,y = 272.3971,mFirstPosition = 0,mActivePointerId = 0,mDataChanged = false,adatper size = 100,this = android.widget.GridView{ddac46 VFED.VC. ........ 351,17-837,478 #7f0f0052 app:id/client_enemy}
06-09 22:15:35.519 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/AbsListView: Touch up: touch mode = 0,mScrollY = 0,mLastY = -2147483648,mMotionPosition = 52,mFirstPosition = 0,mDataChanged = false,adatper size = 100,this = android.widget.GridView{ddac46 VFED.VC. ........ 351,17-837,478 #7f0f0052 app:id/client_enemy}
06-09 22:15:35.559 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.578 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.597 19363-19363/com.marijannovak.potapanjebrodovazavrsni D/AbsListView: performItemClick view=android.widget.ImageView{3e8cc147 V.ED.... ........ 96,250-145,299}, position=52, id=0, mChoiceMode=0, dispatchItemClick=true
06-09 22:15:35.598 19363-19363/com.marijannovak.potapanjebrodovazavrsni V/SettingsInterface:  from settings cache , name = sound_effects_enabled , value = 0
06-09 22:15:35.602 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.617 19363-19600/com.marijannovak.potapanjebrodovazavrsni E/TrackingFlow: Saljem: 52
06-09 22:15:35.627 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.669 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.688 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.706 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.724 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.742 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.759 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.777 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.795 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.814 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:35.974 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.010 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.020 19363-19395/com.marijannovak.potapanjebrodovazavrsni W/MALI: glDrawArrays:714: [MALI] glDrawArrays takes more than 5ms here. Total elapse time(us): 5219
06-09 22:15:36.065 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.105 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.132 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.149 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.167 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.183 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.200 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.216 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.232 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
06-09 22:15:36.249 19363-19395/com.marijannovak.potapanjebrodovazavrsni D/Surface: Surface::setBuffersDimensions(this=0xb45a0c00,w=480,h=854)
 
Upvote 0
Do you know how to run your app in debug mode, set breakpoints, and step through execution of the code?

What I would do is set a breakpoint at the indicated line, and step through the code, line by line. Taking note of what data is being read from the input stream. What is in your read buffer?

Code:
            int bufferSize = 1024;
            int bytesRead = -1;
            byte[] buffer = new byte[bufferSize];
            //Keep reading the messages while connection is open...
            while(READ){   // <------- Set breakpoint here
 
Last edited by a moderator:
Upvote 0

BEST TECH IN 2023

We've been tracking upcoming products and ranking the best tech since 2007. Thanks for trusting our opinion: we get rewarded through affiliate links that earn us a commission and we invite you to learn more about us.

Smartphones