Saturday, July 19, 2025

Essential Android Interview Questions and Answers to Jumpstart Your Preparation

 1- Jetpack Compose Interview Questions and Answers

Advanced Jetpack Compose Interview Questions and Answers

 Q: What is the Slot API in Jetpack Compose?

 A: The Slot API allows developers to pass Composables as parameters, enabling content injection.

 It's commonly used in custom UI components like Scaffold, AlertDialog, or your own Composable

 functions.


 Q: Explain Skippable vs Restartable Composables.

 A: Restartable: Composables that can be re-invoked during recomposition.

 Skippable: If Compose determines that inputs haven't changed, it can skip recomposing them to

 improve performance.


 Q: How does Jetpack Compose handle recomposition behind the scenes?

 A: Compose uses a snapshot system that tracks state reads during composition. When state

 changes, Compose only re-executes affected Composables (based on changed state).


 Q: What is LaunchedEffect and when should you use it?

 A: LaunchedEffect runs suspend functions in a composable-safe coroutine scope. It is keyed, so

 when the key changes, the block cancels and restarts. Useful for one-time effects or when inputs

 change.


 Q: How does rememberCoroutineScope() differ from LaunchedEffect?

 A: rememberCoroutineScope() provides a scoped CoroutineScope that survives recomposition,

 giving you manual control. LaunchedEffect is lifecycle-aware and tied to composition changes.


 Q: What is derivedStateOf and when should it be used?

 A: derivedStateOf creates a derived state from other state objects, recomputing only when inputs

 change. Ideal for expensive computations that depend on observable state.


 Q: How do you implement a performant LazyColumn with dynamic content?

 A: Use key parameter to prevent unnecessary recompositions.

 Use itemsIndexed() or items() with unique keys.

 Avoid state inside each row unless necessary.

 Use rememberLazyListState() for scroll handling and performance tracking.


 Q: How do you integrate Jetpack Compose with legacy View-based code?

 A: Use ComposeView in XML layout.

 Use AndroidView() to embed Views inside Compose.

 Share ViewModels and data layers to bridge both systems.


 Q: What are Modifier.composed {} and why is it needed?

 A: Modifier.composed {} is used to create custom Modifiers with internal state or side effects.

 Allows access to remember and recomposition-aware logic inside a Modifier.


 Q: How do you measure and layout custom Composables manually?

 A: Use Layout { measurables, constraints -> ... } to measure and place children manually, enabling

 complex UI designs like custom flow layouts, staggered grids, etc.


 Q: What is the difference between Material2 and Material3 in Compose?

 A: Material3 (aka Material You) is the new design system with dynamic theming, more flexible color

 systems, and newer components.

 Material3 APIs are backward-compatible with Material2 in Compose but require setup with new

 theming.


 Q: How do you test side effects and navigation in Compose?

 A: Use ComposeTestRule.setContent {} for Composable testing.

 Test NavController behavior using TestNavHostController.

 Use assertIsDisplayed(), performClick(), etc. from compose.ui.test.


 Q: What are the best practices to avoid recomposition performance issues?

 A: Use remember, rememberUpdatedState

 Stable classes / data structures

 Keys in Lazy layouts

 derivedStateOf

 snapshotFlow to observe state efficiently


 Q: How do you implement Compose in Clean Architecture / Modular App?

 A: UI Layer: Compose only

 ViewModel: Use StateFlow / UiState

 Domain Layer: Pure Kotlin logic

 Navigation and state hoisting should be delegated from Composables to ViewModels or UseCases.


 Q: What's the use of SideEffect, DisposableEffect, and rememberUpdatedState?

 A: SideEffect: Executes after every successful recomposition. Use for non-composable side effects

 like analytics logging.

 DisposableEffect: Manages lifecycle and cleanup like observers or callbacks.

 rememberUpdatedState: Keeps the latest lambda across recompositions without restarting effects.


 Q: How do you handle authentication flows with Compose + Navigation?

 A: Use NavController and authentication state (e.g., isLoggedIn) from ViewModel.

 Conditionally navigate to authenticated vs unauthenticated routes using navigation graph changes

 or conditional Composables.


 Q: How does Compose manage state hoisting and why is it important?

 A: State hoisting is the practice of moving state ownership to a higher-level Composable.

 Makes Composables stateless, testable, and reusable.


 Q: Explain Compose's snapshot system.

 A: Compose uses a snapshot system that tracks reads/writes of state.

It batches changes and triggers recomposition only when relevant state is modified.


 Q: How do you debug recomposition issues?

 A: Use log statements in Composables

 Use Android Studio Composition Tracing and Layout Inspector

 Annotate Composables with @Stable, @Immutable for optimization


 Q: Can you explain why a Composable is recomposing unnecessarily and how to fix it?

 A: Common reasons:- Mutable state in wrong scope- Lack of key in LazyColumn- Recreating lambda in parameters- Unstable data types

 Fix: Hoist state, use remember, use stable classes


Android Security Interview Questions :

Q: What is Android sandboxing?

A: Android runs each app in its own sandbox to isolate data and processes, enforced by the Linux kernel.

Q: How does Android protect app data by default?

A: By storing data in internal storage, which is private to the app and inaccessible to others unless rooted.

Q: What is the purpose of android:exported?

A: It determines whether a component is accessible to other apps. Required from Android 12 for components with intent filters.

Q: What is ProGuard or R8 and how do they help?

A: They obfuscate the code, making reverse engineering harder by renaming classes and methods.

Q: What is the difference between install-time and runtime permissions?

A: Install-time permissions are granted when the app is installed, while runtime permissions are requested during app usage.

Q: What’s the risk of using external storage?

A: External storage is readable by other apps with storage permissions, risking data leakage.

Q: Why is enabling JavaScript in WebView risky?

A: It can expose the app to XSS or remote code execution if untrusted content is loaded.

Q: What is android:allowBackup and why is it risky?

A: If set to true, app data can be backed up and restored, potentially leaking sensitive data.

Q: What is an implicit vs explicit intent?

A: Explicit intents target a specific component; implicit ones allow other apps to handle them, which can lead to hijacking.

Q: What is Network Security Configuration?

A: An XML configuration that controls network security policies like HTTPS enforcement and certificate pinning.

Q: How do you securely store user credentials?

A: Use Android Keystore to store encryption keys, and EncryptedSharedPreferences or SQLCipher for data.

Q: What is Android Keystore?

A: A system component that securely generates and stores cryptographic keys in a hardware-backed environment.

Q: How do you prevent sensitive data from being logged?

A: Avoid logging sensitive information and remove logs in release builds using ProGuard rules.

Q: What is Tapjacking and how to prevent it?

A: A UI deception attack. Prevent it by setting WindowManager.LayoutParams.FLAG_SECURE on sensitive screens.

Q: How can you protect your app from reverse engineering?

A: Obfuscate code, avoid hardcoded secrets, use native code for sensitive logic, and detect rooting.

Q: What is Certificate Pinning?

A: Ensures the app communicates only with a specified server certificate, preventing MITM attacks.

Q: How do you restrict access to ContentProviders?

A: Set android:exported to false and define permissions for external access.

Q: What is SELinux and how does it secure Android?

A: SELinux applies mandatory access control policies that restrict apps even at the system level.

Q: What is Android Verified Boot?

A: It ensures the device boots using verified system images, protecting against boot-level malware.

Q: What is SafetyNet and Play Integrity API?

A: APIs to verify device and app integrity, detect rooting, and prevent tampering or abuse.

Q: What is dynamic code loading and why is it risky?

A: Loading external code at runtime can introduce malicious code. Use only trusted sources and HTTPS.

Q: How to detect if a device is rooted?

A: Check for su binary, root apps, test-keys, and use SafetyNet or Play Integrity API.

Q: How to secure API keys in an app?

A: Do not hardcode. Use NDK with Keystore or store keys server-side and use short-lived tokens.

Q: How to protect a payment feature in an app?

A: Use HTTPS, certificate pinning, validate inputs, store encrypted data, and integrity APIs.

Q: User reports data theft. What steps do you take?

A: Check logs, validate secure storage and network handling, and verify app/device integrity.



Wednesday, October 5, 2016

Library (jar) creation with androidstudio

There are two way in android to create library project first use project with whole source code with plugin type library in gradle and second create jar file.

Both type has their different uses regarding application requirement.
In eclipse it is very simple just check islibrary project option in add library section and you can generate library project but for android studio it is different way to create library project.

Here is the steps to create jar file using android studio and also same project can be added as a library module without generating jar .


1) Create a project.

2) open file build.gradel of module level

3) change one line in build.gradel module level:
apply plugin: 'com.android.application' -> apply plugin: 'com.android.library'

4) remove applicationId in the module level build.gradel file .

applicationId "com.mycomp.testproject"

5) build project
Build > ReBuild Project

6) then you can get aar file
app > build > outputs > aar folder

7) change aar file extension name into zip

8) unzip, and you can see classes.jar in the folder.
rename with your library name with this jar and use it!

Wednesday, August 31, 2016

Android Standard Icon Sizes

Android application development require standard application icon with different sizes to handle multiple screen-size for different devices.
below is the standard images sizes :  
mdpi (Baseline): 160 dpi 1×
hdpi: 240 dpi 1.5×
xhdpi: 320 dpi 2×
xxhdpi: 480 dpi 3×
xxxhdpi: 640 dpi 4× (launcher icon only)
Launcher icons (.Png images)
48 × 48 (mdpi)
72 × 72 (hdpi)
96 × 96 (xhdpi)
144 × 144 (xxhdpi)
192 × 192 (xxxhdpi)
512 × 512 (Google Play store)
Action bar, Dialog & Tab icons
24 × 24 area in 32 × 32 (mdpi)
36 × 36 area in 48 × 48 (hdpi)
48 × 48 area in 64 × 64 (xhdpi)
72 × 72 area in 96 × 96 (xxhdpi)
96 × 96 area in 128 × 128 (xxxhdpi)*
Notification icons
22 × 22 area in 24 × 24 (mdpi)
33 × 33 area in 36 × 36 (hdpi)
44 × 44 area in 48 × 48 (xhdpi)
66 × 66 area in 72 × 72 (xxhdpi)
88 × 88 area in 96 × 96 (xxxhdpi)*
Small Contextual Icons
16 × 16 (mdpi)
24 × 24 (hdpi)
32 × 32 (xhdpi)
48 × 48 (xxhdpi)
64 × 64 (xxxhdpi)*
 Most of the cases developer does not put all images and app will work because usually android picks drawable from other folder and most of cases that works also, 
but it is a good practice to having all icon and images with standard size and places.

Thursday, July 21, 2016

SMS READER IN ANDROID


SMS READER IN ANDROID:

Now a days many application providing functionality for SMS. In android programming we can implement this functionality with the below permission permissions

<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

Below example code can be copied from here in desired application and It can read all inbox as well as it updates SMS when new SMS comes on user device.

We can develop whole messaging apps if we want make that functionality to part of our application like few apps providing that functionality to make their apps as a default messenger app.
Here is SMS reader example

Android manifest permission:

<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

<activity
    android:name=".SmsActivity"
    android:label="@string/app_name" >
   <!-- <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>-->
</activity>

<receiver android:name=".SmsBroadcastReceiver" android:exported="true" >
    <intent-filter android:priority="999" >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>



XML implementation  (activity_sms.xml):


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:id="@+id/MainLayout"
    android:weightSum="1"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="SMS Inbox"
        android:id="@+id/textView"
        android:layout_gravity="center_horizontal"
       />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".15">

        <ListView android:id="@+id/SMSList"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:layout_margin="5dp" />
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight=".85"
        android:gravity="center_horizontal">


        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:text="Report"
            android:textColor="@color/white"
            android:background="@color/darkVoilet"
            android:id="@+id/btn_report"
            android:layout_gravity="center"/>
    </LinearLayout>

</LinearLayout>


values / Colors.xml  :


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

        <color name="lightVoilet">#ccccff</color>
    <color name="darkVoilet">#944dff</color>
    <color name="white">#ffffff</color>
</resources>


Activity Class  - SmsActivity.java :
 
 
package com.example.com.testapp;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class SmsActivity extends AppCompatActivity implements OnItemClickListener,View.OnClickListener {

    private static SmsActivity inst;
    ArrayList<String> smsMessagesList = new ArrayList<String>();
    ListView smsListView;
    ArrayAdapter arrayAdapter;
    Button btn_report;

    public static SmsActivity instance() {
        return inst;
    }

    @Override
    public void onStart() {
        super.onStart();
        inst = this;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
        btn_report=(Button)findViewById(R.id.btn_report);
        btn_report.setOnClickListener(this);
        smsListView = (ListView) findViewById(R.id.SMSList);
        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, smsMessagesList);
        smsListView.setAdapter(arrayAdapter);
        smsListView.setOnItemClickListener(this);

        refreshSmsInbox();
    }

   /*
   Coloum details for SMS reader
    olumn ID    –   Column Name

    0                      :      _id
    1                      :     thread_id
    2                      :     address
    3                      :     person
    4                      :     date
    5                      :     protocol
    6                      :     read
    7                      :    status
    8                      :    type
    9                      :    reply_path_present
    10                   :    subject
    11                   :    body
    12                   :    service_center
    13                   :    locked*/

    public void refreshSmsInbox() {
        ContentResolver contentResolver = getContentResolver();
        Cursor smsInboxCursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null);
        int indexBody = smsInboxCursor.getColumnIndex("body");
        int indexAddress = smsInboxCursor.getColumnIndex("address");
        if (indexBody < 0 || !smsInboxCursor.moveToFirst()) return;
        arrayAdapter.clear();
        do {
            String str = "SMS From: " + smsInboxCursor.getString(indexAddress) +
                    "\n" + smsInboxCursor.getString(indexBody) + "\n";
            arrayAdapter.add(str);
        } while (smsInboxCursor.moveToNext());
    }

    public void updateList(final String smsMessage) {
        arrayAdapter.insert(smsMessage, 0);
        arrayAdapter.notifyDataSetChanged();
    }

    public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
        try {
            String[] smsMessages = smsMessagesList.get(pos).split("\n");
            String address = smsMessages[0];
            String smsMessage = "";
            for (int i = 1; i < smsMessages.length; ++i) {
                smsMessage += smsMessages[i];
            }

            String smsMessageStr = address + "\n";
            smsMessageStr += smsMessage;
            Toast.makeText(this, smsMessageStr, Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.btn_report:

        }
    }


}


Broadcast receiver – SmsBroadcastReceiver :

package com.example.com.testapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SmsBroadcastReceiver extends BroadcastReceiver {

    public static final String SMS_BUNDLE = "pdus";

    public void onReceive(Context context, Intent intent) {
        Bundle intentExtras = intent.getExtras();
        if (intentExtras != null) {
            Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
            String smsMessageStr = "";
            for (int i = 0; i < sms.length; ++i) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);

                String smsBody = smsMessage.getMessageBody().toString();
                String address = smsMessage.getOriginatingAddress();

                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";
            }
            Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show();

            //this will update the UI with message
            SmsActivity inst = SmsActivity.instance();
            inst.updateList(smsMessageStr);
        }
    }
}


I have write here only for reader code making few changes sms writing functionality can be implemented.











SMS READER IN ANDROID


SMS READER IN ANDROID:

Now a days many application providing functionality for SMS. In android programming we can implement this functionality with the below permission permissions

<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

Below example code can be copied from here in desired application and It can read all inbox as well as it updates SMS when new SMS comes on user device.

We can develop whole messaging apps if we want make that functionality to part of our application like few apps providing that functionality to make their apps as a default messenger app.
Here is SMS reader example

Android manifest permission:

<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

<activity
    android:name=".SmsActivity"
    android:label="@string/app_name" >
   <!-- <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>-->
</activity>

<receiver android:name=".SmsBroadcastReceiver" android:exported="true" >
    <intent-filter android:priority="999" >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>



XML implementation  (activity_sms.xml):


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:id="@+id/MainLayout"
    android:weightSum="1"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="SMS Inbox"
        android:id="@+id/textView"
        android:layout_gravity="center_horizontal"
       />

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".15">

        <ListView android:id="@+id/SMSList"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:layout_margin="5dp" />
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight=".85"
        android:gravity="center_horizontal">


        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:text="Report"
            android:textColor="@color/white"
            android:background="@color/darkVoilet"
            android:id="@+id/btn_report"
            android:layout_gravity="center"/>
    </LinearLayout>

</LinearLayout>


values / Colors.xml  :


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

        <color name="lightVoilet">#ccccff</color>
    <color name="darkVoilet">#944dff</color>
    <color name="white">#ffffff</color>
</resources>


Activity Class  - SmsActivity.java :
 
 
package com.example.com.testapp;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class SmsActivity extends AppCompatActivity implements OnItemClickListener,View.OnClickListener {

    private static SmsActivity inst;
    ArrayList<String> smsMessagesList = new ArrayList<String>();
    ListView smsListView;
    ArrayAdapter arrayAdapter;
    Button btn_report;

    public static SmsActivity instance() {
        return inst;
    }

    @Override
    public void onStart() {
        super.onStart();
        inst = this;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
        btn_report=(Button)findViewById(R.id.btn_report);
        btn_report.setOnClickListener(this);
        smsListView = (ListView) findViewById(R.id.SMSList);
        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, smsMessagesList);
        smsListView.setAdapter(arrayAdapter);
        smsListView.setOnItemClickListener(this);

        refreshSmsInbox();
    }

   /*
   Coloum details for SMS reader
    olumn ID    –   Column Name

    0                      :      _id
    1                      :     thread_id
    2                      :     address
    3                      :     person
    4                      :     date
    5                      :     protocol
    6                      :     read
    7                      :    status
    8                      :    type
    9                      :    reply_path_present
    10                   :    subject
    11                   :    body
    12                   :    service_center
    13                   :    locked*/

    public void refreshSmsInbox() {
        ContentResolver contentResolver = getContentResolver();
        Cursor smsInboxCursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null);
        int indexBody = smsInboxCursor.getColumnIndex("body");
        int indexAddress = smsInboxCursor.getColumnIndex("address");
        if (indexBody < 0 || !smsInboxCursor.moveToFirst()) return;
        arrayAdapter.clear();
        do {
            String str = "SMS From: " + smsInboxCursor.getString(indexAddress) +
                    "\n" + smsInboxCursor.getString(indexBody) + "\n";
            arrayAdapter.add(str);
        } while (smsInboxCursor.moveToNext());
    }

    public void updateList(final String smsMessage) {
        arrayAdapter.insert(smsMessage, 0);
        arrayAdapter.notifyDataSetChanged();
    }

    public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
        try {
            String[] smsMessages = smsMessagesList.get(pos).split("\n");
            String address = smsMessages[0];
            String smsMessage = "";
            for (int i = 1; i < smsMessages.length; ++i) {
                smsMessage += smsMessages[i];
            }

            String smsMessageStr = address + "\n";
            smsMessageStr += smsMessage;
            Toast.makeText(this, smsMessageStr, Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.btn_report:

        }
    }


}


Broadcast receiver – SmsBroadcastReceiver :

package com.example.com.testapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SmsBroadcastReceiver extends BroadcastReceiver {

    public static final String SMS_BUNDLE = "pdus";

    public void onReceive(Context context, Intent intent) {
        Bundle intentExtras = intent.getExtras();
        if (intentExtras != null) {
            Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
            String smsMessageStr = "";
            for (int i = 0; i < sms.length; ++i) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);

                String smsBody = smsMessage.getMessageBody().toString();
                String address = smsMessage.getOriginatingAddress();

                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";
            }
            Toast.makeText(context, smsMessageStr, Toast.LENGTH_SHORT).show();

            //this will update the UI with message
            SmsActivity inst = SmsActivity.instance();
            inst.updateList(smsMessageStr);
        }
    }
}


I have write here only for reader code making few changes sms writing functionality can be implemented.











Monday, July 4, 2016

CSV file read and write in android

CSV WRITE AND READ IN ANDROID

There are many time in android programmers needs to write CSV or export few reports, data in csv format. There are many open source third party libraries available to do this but for the same you can write code without using any third party library.

According to my observation it is better Idea to write own code instead of using third party library like Opencsv libs etc. Generally library is designed to perform multiple task and for the same lots of code used inside library and our requirement is only to read or write csv file then why should we increase our code size to using library.

There is a simple way to read and write CSV without any third party library:


1)      Create a directory to write file

File folder = new File(Environment.getExternalStorageDirectory()
        + "/TestFolder");

boolean var = false;
if (!folder.exists())
    var = folder.mkdir();

System.out.println("" + var);


String fileName = folder.toString() + "/" + "Test.csv";



2)      Writing a CSV file

  FileWriter writer = new FileWriter(fileName);

 writer.append("DisplayName");
 writer.append(',');
 writer.append("Age");
 writer.append('\n');

 writer.append("RAM");
 writer.append(',');
 writer.append("21");
 writer.append('\n');

 writer.append("ROHAN");
 writer.append(',');
 writer.append("22");
 writer.append('\n');


3)      Read CSV file

String []data ;

   FileInputStream fis = new FileInputStream(file);


   BufferedReader r = new BufferedReader(new InputStreamReader(fis));


   while ((strLine = r.readLine()) != null)   {


                                  dataValue = line.split(",");


                                         String first = dataValue[1];


     String second = dataValue[2];
        }
   r.close();



Using the above code snippet user can read and write csv files below is whole function for the same.



public void generateCsvFile()
{
    try
    {

        File folder = new File(Environment.getExternalStorageDirectory()
                + "/ TestFolder ");

        boolean var = false;
        if (!folder.exists())
            var = folder.mkdir();

        System.out.println("" + var);


        String fileName = folder.toString() + "/" + "Test.csv";

//Here logic can be write to arrange required format of data
        FileWriter writer = new FileWriter(fileName);

        writer.append("DisplayName");
        writer.append(',');
        writer.append("Age");
        writer.append('\n');

        writer.append("RAM");
        writer.append(',');
        writer.append("26");
        writer.append('\n');

        writer.append("ROHAN");
        writer.append(',');
        writer.append("29");
        writer.append('\n');

        writer.flush();
        writer.close();

    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}