Search This Blog

Saturday 30 March 2013

how to develop android application for xxhdpi device Samsung S4, HTC one, Sony Xperia z etc

New giant innovation Samsung Galaxy S4,Sony Xperia Z and HTC one are coming in android history.  S4 new dimension has created excitement for android user. Lets see what S4  and these phone contains

Samsung S4   - 1080x1920 resolution with a high pixel density of 441ppi, Screen size of 4.99 inch
HTC one          - 1080x1920 resolution with a high pixel density of 478ppi, Screen little less than 4.99 inch
Sony Xperia Z - 1080x1920 resolution with a high pixel density of 441ppi, Screen size of 4.99 inch

Android user are happy because they will get phenomal quality of display. as well as developer are shocked as their application need to support one more device. Still we have following device type on the base of density

drawable-hdpi                               -  high density
drawable-ldpi                             -  low  density(almost remove from android)
drawable-mdpi                              -  Small Screen device with medium density
drawable-tvdpi                            
drawable-xhdpi                             -  Extra high density
drawable-xlarge-mdpi                   -  Large screen with medium density

So if our application support all these device, then we need to keep one image of every type in each folder for bettter look. But because of above phone we have to take extra care about new density drawable-xxhdpi

While increasing support for above drawable-xxhdpi phone (as they are about to come in market) then we have to follow these steps to ensure best application and keep these image in seperate folder inside res named drawable-xxhdpi

Step 1) Your designer should make image by keeping in mind that device resolution is 1080x1920



Step 2) How to test without real device. No body had these device as they are still to launch or if they launch too then it will take time to get this device for developer. So we have to add new device definition of 1080x1920 to create a new emulator. See the screen shot

Step 3) Now you can run your application on this emulator, above steps will make this device definition available in Graphical Layout. you can check the design


Challenge - Consider a case when you take picture from such a high definition device, and this same image are used one the other device ! How difficult will be to handle these images without exceeding your application heap size. for that we have to scale image. It will add overhead to developer.

Keep in mind everything and then develop your new application. You can not take a risk to avoid the support for these device.

Tuesday 26 March 2013

Google Maps Android API v2 MapFragment tutorial - Implementing Map inside a Fragment

Using MapFragment Android release MapFragment to integrate Map into fragment. using Mapfragment is quite difficult to start but very simple to handle. First of all see Generating Map Key for Google Console project.  Now in Android APP API v2,  include Google play service so you need to add Google Play Service into your project.
    

See screen shot




Step 1) Change your manifest and add permission , Some permission start with you package name. So if you change package of this project than use it. My package name is com.mapfragment. Made changes to your manifest like this

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mapfragment"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:maxSdkVersion="17"
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <permission
        android:name="com.mapfragment.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.mapfragment.permission.MAPS_RECEIVE" />
    <!-- Copied from Google Maps Library/AndroidManifest.xml. -->

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <!-- External storage for caching. -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- My Location -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- Maps API needs OpenGL ES 2.0. -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="com.google.android.maps" />
        <!-- You must insert your own Google Maps for Android API v2 key in here. -->
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"

android:value="yourkey" />

<activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

Step 2) Create two xml inside res/layout folder. One contain FrameLayout ( To embed Fragment inside it) and other contains MapFragment
main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:id="@+id/mainl"
    android:layout_height="match_parent" >

</FrameLayout>

Step 3) Do some changes inside your main activity and create one Fragment class to integrate it with in the MainActivity

MainActivity.java
package com.mapfragment;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;

import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.SupportMapFragment;

public class MainActivity extends FragmentActivity {
    GoogleMap mapView;
    com.google.android.gms.maps.Projection projection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FragmentTransaction mTransaction = getSupportFragmentManager()
                .beginTransaction();
        SupportMapFragment mFRaFragment = new MapFragmentD();
        mTransaction.add(R.id.mainl, mFRaFragment);
        mTransaction.commit();

        try {
            MapsInitializer.initialize(this);
        } catch (GooglePlayServicesNotAvailableException e) {
            e.printStackTrace();
        }
    }

}
MapFragmentD.Java
package com.mapfragment;

import android.app.Activity;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapFragmentD extends SupportMapFragment {

    GoogleMap mapView;

    @Override
    public void onCreate(Bundle arg0) {
        super.onCreate(arg0);
    }

    @Override
    public View onCreateView(LayoutInflater mInflater, ViewGroup arg1,
            Bundle arg2) {
        return super.onCreateView(mInflater, arg1, arg2);
    }

    @Override
    public void onInflate(Activity arg0, AttributeSet arg1, Bundle arg2) {
        super.onInflate(arg0, arg1, arg2);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mapView = getMap();
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.draggable(true);
        markerOptions.position(new LatLng(23.231251f, 71.648437f));
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker());
        mapView.addMarker(markerOptions);
    }
}
Now Lets see How to display Ping on location


        mapView = getMap();
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.draggable(true);
        markerOptions.position(new LatLng(23.231251f, 71.648437f));
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker());
        mapView.addMarker(markerOptions);



Download SourceCode

Audio recording example in android using MediaRecorder

Recording audio in androd is simple. This article use MediaRecoder class to record Audio, Same class is used for recording video. This below class will illustrate the complete task of recording video

Recording.java 

import java.io.IOException;

import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.FragmentActivity;

public class Recording extends FragmentActivity {
    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        try {
            MediaRecorder recorder = new MediaRecorder();
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            String str = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
            recorder.setOutputFile(str + "/" + System.currentTimeMillis()
                    + ".mp3");
            try {
                recorder.prepare();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            recorder.start();
        } catch (Exception e) {
            e.getMessage();
        }
    }
}

Lets have a look how it work
recorder.setAudioSource(MediaRecorder.AudioSource.MIC) : set the source of audio. Here mic is doing the work of recording taking user voice as input

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP) : Audio format in which you want output Setting path to reuse the recorded Audio

String str = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();
recorder.setOutputFile(str + "/" + System.currentTimeMillis()
                    + ".mp3");

Permission is require to record audio and to save video inside manifest

<uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

How to make ListView Divider transparent in android?

ListView has strong support for customizaton. Generally, we need customize divider in listview to seprate each row. But some times we need divider with transparency. Divider occupies the place but with no backrgound, it seems like transparent space between the rows of ListView.
 
mListView.setDividerHeight(10);
mListView.setDivider(getResources().getDrawable(android.R.color.transparent));

mListView is the instance of ListView. These two line will create divider with white space

Thursday 14 March 2013

How to improve your concentration while developing software, mobile application?

Being software developer is a pain full situation when we want to focus but fail to focus. In most cases we misjudge our ability and caliber. We start criticize our self for what we should responsible. We forget that we are human being and we born to commit mistakes. We born to learn from our mistake. As a mobile application developer, i have gone through the same situation many times. Every time i try to avoid with some set of rules and principles that worked for me. So let share with each among us

Always leave on time
Generally people thinks that working for longer hours will increase your performance at works. But it never does as i feel. Developing a software is not physical work, so you can not work until your mind is not active. Sitting for more hours will drain your brain and stop thinking. It need quality time rather than being sitting for longer hours. So try to leave on time, yes indeed if you need any urgency and have to work for client late then sitting for more hours does not harm. But it should be a fashion. leaving on time will make you more focus because you have to complete task with in the time

Plan one thing at a time
A CPU can execute million of calculation with in milliseconds but nothing is creative. We have a human mind, we have some limitation and some exceptional abilities. Give half an hour in morning for planning. Allocate task to yourself, divide expected time and start working. Do not spend too much time on a particular thing and continue work till the day end. Now observe what you have completed. If you fail to do something than find the reason, but do not switch on panic button.

Take short break
Stand up from chair every two hours. Take some walk for 2 minute, drink water and again start working. It will relax your brain muscles and boost your concentration for coming two hours. Believe it increase my output 20 %. And most importantly it reduce bug from software i made. In break you can talk to your colleague, it will help you to maintain healthy relationship. But do not misuse break. I call this break, break for bugs

Next....

Wednesday 13 March 2013

Binding service using Android Interface DefinitionLanguage (.aidl) in android

Binding service using iBinder an Messanger already discussesd. Third and most complicated way is binding service using Android Interface Definition Language (AIDL). Its rarely use and hard to implement. So this post simply will show you how to create one connection using Android Interface Definition Language (AIDL) between activity and service

 When to use Android Interface Definition Language (AIDL)

Using AIDL is necessary only if you allow clients from different applications to access your service for IPC and want to handle multithreading in your service. If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger. Knowledge Required you should read about binding service using IBinder and Messanger

 Steps 1) create .aidl interface. Create one file name IRemoteService.aidl and keep inside your main package


 // IRemoteService.aidl  
 package com.example.locationmanager;  
 // Declare any non-default types here with import statements  
 /** Example service interface */  
 interface IRemoteService {  
 /** Request the process ID of this service, to do evil things with it. */  
 int getPid();  
 /** Demonstrates some basic types that you can use as parameters  
 * and return values in AIDL.  
 */  
 void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,  
 double aDouble, String aString);  
 }  

When you build your application IRemoteService.aidl changes into IRemoteService.java like this. You can find this inside bin folder

 // Declare any non-default types here with import statements  
 /** Example service interface */  
 public interface IRemoteService extends android.os.IInterface {  
 /** Local-side IPC implementation stub class. */  
 public static abstract class Stub extends android.os.Binder implements  
 com.example.locationmanager.IRemoteService {  
 private static final java.lang.String DESCRIPTOR = "com.example.locationmanager.IRemoteService";  
 /** Construct the stub at attach it to the interface. */  
 public Stub() {  
 this.attachInterface(this, DESCRIPTOR);  
 }  
 /**  
 * Cast an IBinder object into an  
 * com.example.locationmanager.IRemoteService interface, generating a  
 * proxy if needed.  
 */  
 public static com.example.locationmanager.IRemoteService asInterface(  
 android.os.IBinder obj) {  
 if ((obj == null)) {  
 return null;  
 }  
 android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);  
 if (((iin != null) && (iin instanceof com.example.locationmanager.IRemoteService))) {  
 return ((com.example.locationmanager.IRemoteService) iin);  
 }  
 return new com.example.locationmanager.IRemoteService.Stub.Proxy(  
 obj);  
 }  
 @Override  
 public android.os.IBinder asBinder() {  
 return this;  
 }  
 @Override  
 public boolean onTransact(int code, android.os.Parcel data,  
 android.os.Parcel reply, int flags)  
 throws android.os.RemoteException {  
 switch (code) {  
 case INTERFACE_TRANSACTION: {  
 reply.writeString(DESCRIPTOR);  
 return true;  
 }  
 case TRANSACTION_getPid: {  
 data.enforceInterface(DESCRIPTOR);  
 int _result = this.getPid();  
 reply.writeNoException();  
 reply.writeInt(_result);  
 return true;  
 }  
 case TRANSACTION_basicTypes: {  
 data.enforceInterface(DESCRIPTOR);  
 int _arg0;  
 _arg0 = data.readInt();  
 long _arg1;  
 _arg1 = data.readLong();  
 boolean _arg2;  
 _arg2 = (0 != data.readInt());  
 float _arg3;  
 _arg3 = data.readFloat();  
 double _arg4;  
 _arg4 = data.readDouble();  
 java.lang.String _arg5;  
 _arg5 = data.readString();  
 this.basicTypes(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5);  
 reply.writeNoException();  
 return true;  
 }  
 }  
 return super.onTransact(code, data, reply, flags);  
 }  
 private static class Proxy implements  
 com.example.locationmanager.IRemoteService {  
 private android.os.IBinder mRemote;  
 Proxy(android.os.IBinder remote) {  
 mRemote = remote;  
 }  
 @Override  
 public android.os.IBinder asBinder() {  
 return mRemote;  
 }  
 public java.lang.String getInterfaceDescriptor() {  
 return DESCRIPTOR;  
 }  
 /**  
 * Request the process ID of this service, to do evil things with  
 * it.  
 */  
 @Override  
 public int getPid() throws android.os.RemoteException {  
 android.os.Parcel _data = android.os.Parcel.obtain();  
 android.os.Parcel _reply = android.os.Parcel.obtain();  
 int _result;  
 try {  
 _data.writeInterfaceToken(DESCRIPTOR);  
 mRemote.transact(Stub.TRANSACTION_getPid, _data, _reply, 0);  
 _reply.readException();  
 _result = _reply.readInt();  
 } finally {  
 _reply.recycle();  
 _data.recycle();  
 }  
 return _result;  
 }  
 /**  
 * Demonstrates some basic types that you can use as parameters and  
 * return values in AIDL.  
 */  
 @Override  
 public void basicTypes(int anInt, long aLong, boolean aBoolean,  
 float aFloat, double aDouble, java.lang.String aString)  
 throws android.os.RemoteException {  
 android.os.Parcel _data = android.os.Parcel.obtain();  
 android.os.Parcel _reply = android.os.Parcel.obtain();  
 try {  
 _data.writeInterfaceToken(DESCRIPTOR);  
 _data.writeInt(anInt);  
 _data.writeLong(aLong);  
 _data.writeInt(((aBoolean) ? (1) : (0)));  
 _data.writeFloat(aFloat);  
 _data.writeDouble(aDouble);  
 _data.writeString(aString);  
 mRemote.transact(Stub.TRANSACTION_basicTypes, _data,  
 _reply, 0);  
 _reply.readException();  
 } finally {  
 _reply.recycle();  
 _data.recycle();  
 }  
 }  
 }  
 static final int TRANSACTION_getPid = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);  
 static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);  
 }  
 /** Request the process ID of this service, to do evil things with it. */  
 public int getPid() throws android.os.RemoteException;  
 /**  
 * Demonstrates some basic types that you can use as parameters and return  
 * values in AIDL.  
 */  
 public void basicTypes(int anInt, long aLong, boolean aBoolean,  
 float aFloat, double aDouble, java.lang.String aString)  
 throws android.os.RemoteException;  
 }  

Step 2) Implement IRemoteService.aidl inside your service. So first create one service class name AidlService.java here

 import android.app.Service;  
 import android.content.Intent;  
 import android.os.IBinder;  
 import android.os.RemoteException;  
 public class AidlService extends Service {  
 @Override  
 public void onCreate() {  
 super.onCreate();  
 }  
 @Override  
 public IBinder onBind(Intent arg0) {  
 return mBinder.asBinder();  
 }  
 private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {  
 @Override  
 public int getPid() throws RemoteException {  
 return 0;  
 }  
 @Override  
 public void basicTypes(int anInt, long aLong, boolean aBoolean,  
 float aFloat, double aDouble, String aString)  
 throws RemoteException {  
 }  
 };  
 }  

Step 3) ServiceConnection class allow to create connection between IRemoteService and your service class. So bind your service inside your activity. Change your main activity code to as follows

 import android.app.Activity;  
 import android.content.ComponentName;  
 import android.content.Context;  
 import android.content.Intent;  
 import android.content.ServiceConnection;  
 import android.os.Bundle;  
 import android.os.IBinder;  
 public class BindAidlActivity extends Activity {  
 @Override  
 protected void onCreate(Bundle savedInstanceState) {  
 super.onCreate(savedInstanceState);  
 bindService();  
 }  
 public void bindService() {  
 Intent intent = new Intent(this, AidlService.class);  
 bindService(intent, new ConnectService(), Context.BIND_AUTO_CREATE);  
 }  
 public void stoppingService() {  
 Intent intent = new Intent(this, AidlService.class);  
 stopService(intent);  
 }  
 IRemoteService uAidlService;  
 public class ConnectService implements ServiceConnection {  
 @Override  
 public void onServiceConnected(ComponentName name, IBinder service) {  
 uAidlService = IRemoteService.Stub.asInterface(service);  
 }  
 @Override  
 public void onServiceDisconnected(ComponentName name) {  
 /**  
 * Called when service disconnected  
 */  
 }  
 }  
 }  

Download All Service Binding Example

Saturday 9 March 2013

Tips and Guidelines to ensure your android phone safety And tools provide to beat hackers

Android is open source platform for mobile. Just nature of being open source makes many doubts in minds, like anyone can do anything with Android, I am not secure enough with android. And the list goes on. Internet giant Google had develop Android with many other and keep it open source to reach to maximum. Risk measure is more compare to iPhone. But Google consider end user to avoid the risk factor, and yes you can avoid it to maximum. Lets just go through what end user can do to secure his/her phone with the given guidelines by Android owner Google

Android provide some user security features in which user does not involve directly


  • File System Encryption

For android 3.0 or later provide you to encrypt your all data and decrypt with AES128 with CBC and ESSIV:SHA256. Encryption key is protected by AES128 using a key derive from your password. You can set your complexity rule using device administrator and enforce operating system. Filesystem encryption requires the use of a user password, pattern-based screen lock is not supported.
Password protection and device administrator are other tool to avoid leak in your secure information from your Android Phone

  • Credential Storage and Virtual Private Network

By default, Android includes a set of predefined Certificate Authorities (CAs) that are trusted for operations such as establishing SSL connections within the browser. In Android 4.0 and later, users can disable preinstalled CAs within the system settings. Users can also add trusted CAs or certificates to the system by importing them from USB storage. Android 4.1 and later adds the ability for OEMs to add hardware-backed KeyChain storage which binds private keys to the device on which they are stored
Android provides a built-in VPN client with support for PPTP, L2TP, and IPsec VPNs.

Android provide some user security features in which does involve directly

Trojen horse and virus are like Guest without invitation but they will enter into your home when you open the door

  • Android most  prominent feature is permission model. For safety of your phone, you need to understand it well


When you install a new application in your phone either its from authorize network( Google Play Store) or any other, it prompt you to read what these application require to access from your phone. and let you allow this or not. This is called permissions, If require Contact read permission and you allow it, then it can read your contact.   So be careful and observe Is particular  application required related permission to its nature.

  • How it differ from other OS system say iPhone .

iPhone use a different approach to user notification, requesting permission at the start of each session or while applications are in use. The vision of Android is to have users switching seamlessly between applications at will. Providing confirmations each time would slow down the user and prevent Android from delivering a great user experience. Having the user review permissions at install time gives the user the option to not install the application if they feel uncomfortable.

Other Need to look for end user


A cost sensitive API is any function that might generate a cost for the user or the network. The Android platform has placed cost sensitive APIs in the list of protected APIs controlled by the OS. The user will have to grant explicit permission to third-party applications requesting use of cost sensitive APIs.

And most importantly Android has keep sim card out of reach to third party application and os will handle all kind of communication with SIM card

Tuesday 5 March 2013

Cross platform development guidelines for iOS to avoid rejection by apple

Recently i have found many complain about phone gap HTML application rejected by Apple. It was annoying to me, As Apple is already using HTML in many product and application. So let first see the relationship between HTML and Apple 

 Apple and HTML

First, let's talk about Apple and HTML. Apple does not reject an application because the user interface is built using HTML. In fact, many Apple apps or advertising platforms for iOS are entirely built with HTML, CSS, and JavaScript. For instance, the Apple Store and iAd advertising platform, among others, use HTML as the primary medium for the user interface. Outside of Apple there are many successful apps that have user interfaces built with HTML, including LinkedIn, Wikipedia, the BBC Olympics, and many, many others.

Note: Not all of these apps mentioned use PhoneGap, but they do use HTML for the UI.

Apple rejects applications that do not because we are making mobile application not mobile website so most importantly user should have

  • a user experience that feels like an "app"
  • feel "at home" in the iOS ecosystem
  • offer a differentiation from a mobile web experience

This applies to all apps, not just apps developed using HTML for the UI.We do not know the exact approval rules beyond the "App Review Guidelines" and "App Store Review Guidelines" provided by Apple. However, it is clear that approval largely comes down to the user experience: how the user interacts with the app and how it "feels" on the device.

The "iOS User Interface Guidelines"  from Apple has a large amount of information about what is and what is not acceptable for Apple's ecosystem. In these UI Guidelines, Apple specifically addresses "web-based designs":

"Reconsider Web-Based Designs
If you're coming from the web, you need to make sure that you give people an iOS app experience, not a web experience. Remember, people can visit your website on their iOS-based devices using Safari on iOS."

Be sure to read the full iOS User Interface Guidelines for tips on creating a great “app” experience using HTML and related technologies.

In addition to the iOS User Interface Guidelines, Apple's "App Store Review Guidelines" has additional tips for getting your apps approved. Many relate to HTML-based experiences, including the following tips:

  1. "2.12: Apps that are not very useful, unique, are simply web sites bundled as Apps, or do not provide any lasting entertainment value may be rejected"
  1. "10.3: Apps that do not use system provided items, such as buttons and icons, correctly and as described in the Apple iOS Human Interface Guidelines may be rejected"
  1. "10.6: Apple and our customers place a high value on simple, refined, creative, well thought through interfaces. They take more work but are worth it. Apple sets a high bar. If your user interface is complex or less than very good, it may be rejected"
  1. "12.3: Apps that are simply web clippings, content aggregators, or a collection of links, may be rejected"
As mentioned earlier, We does not know all of Apple's rules or processes, but the following indicators can result in rejections:

If your app is just a web site wrapped in PhoneGap, it will likely get rejected. There are exceptions to this case, but do not expect that wrapping a web site in a web view will get you into the App Store.
If your app requires the user to pinch/zoom/pan to view content (like a web site), it will probably get rejected. 
If your app just looks like text on a page with hyperlinks, and has no native-like styles, it will probably get rejected.


App store approval often seems like a blurry line and is particular to the individual apps that are being evaluated. Each app is considered on its own merit, functionality, and user experience. The iOS User Interface Guidelines and App Store Review Guidelines are also living documents – they may change as new OS versions are released or new app designs bring up new issues. Be sure to review the guidelines periodically.

Sources Guidline from Adobe for PhoneGap Application

Sunday 3 March 2013

Video Chat API in android provide Group Video Chat, Peer to peer and Mobile to Web

Video chat in android is the hot topic in every mobile either Android or iPhone. While making application based on social networking, including Video chat option can raise your application standard. Even though android does not provide directly anything related to video chat, but there are lots of work around for this.
Challenge while implement Video chat are

  • Video Quality on internet 
  • Video Delay while streaming
  • And implementing between cross platform
So looking for API considering all possibilities is quite difficult before OpenTok comes in to scene.
Before implementing into your project see the pricing which is very crucial to your project nature and scale


OpenTok Pricing

I have been touch with them since last one month, They have launch the early beta version of android version and working hard to launch it completely in April 2013

Current Support for android device

Nexus 4, Nexus 7 and S3

Full Version is expected to launch in next month

How to start implementing 




Android News and source code