Pages

Thursday, March 13, 2014

How to get absolute path when select image from gallery and SD Card (Kitkat and lower android version)?

In some special cast to need get image from gallery to display in application. so I am posting to get absolute path of the selected image from gallery using Intent.ACTION_GET_CONTENT.

In Kitkat version we get different Uri format(DocumentProvider)
Now
Uri format like this : content://com.android.providers.media.documents/document/image:3951
Before
Uri format like this : content://media/external/images/media/3951.

See the Kikat version change here

1. AbsolutePathActivity.java Activity Class

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class AbsolutePathActivity extends Activity 
{
 private static final int MY_INTENT_CLICK=302;
 private TextView txta;
 private Button btn_selectImage;

 @Override
 protected void onCreate(Bundle savedInstanceState) 
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_absolutepath);

  txta = (TextView) findViewById(R.id.textView1);
  btn_selectImage = (Button) findViewById(R.id.btn_selectImage);

  btn_selectImage.setOnClickListener(new OnClickListener() 
  {
   @Override
   public void onClick(View v) 
   {
    Intent intent = new Intent(); 
    intent.setType("*/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Select File"),MY_INTENT_CLICK);
   }
  });

 }

 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data)
 {
  if (resultCode == RESULT_OK)
  {
   if (requestCode == MY_INTENT_CLICK)
   {
    if (null == data) return;

    String selectedImagePath;
    Uri selectedImageUri = data.getData();

    //MEDIA GALLERY
    selectedImagePath = ImageFilePath.getPath(getApplicationContext(), selectedImageUri);
    Log.i("Image File Path", ""+selectedImagePath);
    txta.setText("File Path : \n"+selectedImagePath);
   }
  }
 }
}

Copy below class on your application for getting Gallery image file Uri AbsolutePath.

2.ImageFilePath.java  

import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;

public class ImageFilePath 
{
 
 
 /**
  * Method for return file path of Gallery image 
  * 
  * @param context
  * @param uri
  * @return path of the selected image file from gallery
  */
 public static String getPath(final Context context, final Uri uri) 
 {

  //check here to KITKAT or new version
  final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

  // DocumentProvider
  if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
   
   // ExternalStorageProvider
   if (isExternalStorageDocument(uri)) {
    final String docId = DocumentsContract.getDocumentId(uri);
    final String[] split = docId.split(":");
    final String type = split[0];

    if ("primary".equalsIgnoreCase(type)) {
     return Environment.getExternalStorageDirectory() + "/" + split[1];
    }
   }
   // DownloadsProvider
   else if (isDownloadsDocument(uri)) {

    final String id = DocumentsContract.getDocumentId(uri);
    final Uri contentUri = ContentUris.withAppendedId(
      Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

    return getDataColumn(context, contentUri, null, null);
   }
   // MediaProvider
   else if (isMediaDocument(uri)) {
    final String docId = DocumentsContract.getDocumentId(uri);
    final String[] split = docId.split(":");
    final String type = split[0];

    Uri contentUri = null;
    if ("image".equals(type)) {
     contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    } else if ("video".equals(type)) {
     contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    } else if ("audio".equals(type)) {
     contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    }

    final String selection = "_id=?";
    final String[] selectionArgs = new String[] {
      split[1]
    };

    return getDataColumn(context, contentUri, selection, selectionArgs);
   }
  }
  // MediaStore (and general)
  else if ("content".equalsIgnoreCase(uri.getScheme())) {

   // Return the remote address
   if (isGooglePhotosUri(uri))
    return uri.getLastPathSegment();

   return getDataColumn(context, uri, null, null);
  }
  // File
  else if ("file".equalsIgnoreCase(uri.getScheme())) {
   return uri.getPath();
  }

  return null;
 }

 /**
  * Get the value of the data column for this Uri. This is useful for
  * MediaStore Uris, and other file-based ContentProviders.
  *
  * @param context The context.
  * @param uri The Uri to query.
  * @param selection (Optional) Filter used in the query.
  * @param selectionArgs (Optional) Selection arguments used in the query.
  * @return The value of the _data column, which is typically a file path.
  */
 public static String getDataColumn(Context context, Uri uri, String selection,
   String[] selectionArgs) {

  Cursor cursor = null;
  final String column = "_data";
  final String[] projection = {
    column
  };

  try {
   cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
     null);
   if (cursor != null && cursor.moveToFirst()) {
    final int index = cursor.getColumnIndexOrThrow(column);
    return cursor.getString(index);
   }
  } finally {
   if (cursor != null)
    cursor.close();
  }
  return null;
 }

 /**
  * @param uri The Uri to check.
  * @return Whether the Uri authority is ExternalStorageProvider.
  */
 public static boolean isExternalStorageDocument(Uri uri) {
  return "com.android.externalstorage.documents".equals(uri.getAuthority());
 }

 /**
  * @param uri The Uri to check.
  * @return Whether the Uri authority is DownloadsProvider.
  */
 public static boolean isDownloadsDocument(Uri uri) {
  return "com.android.providers.downloads.documents".equals(uri.getAuthority());
 }

 /**
  * @param uri The Uri to check.
  * @return Whether the Uri authority is MediaProvider.
  */
 public static boolean isMediaDocument(Uri uri) {
  return "com.android.providers.media.documents".equals(uri.getAuthority());
 }

 /**
  * @param uri The Uri to check.
  * @return Whether the Uri authority is Google Photos.
  */
 public static boolean isGooglePhotosUri(Uri uri) {
  return "com.google.android.apps.photos.content".equals(uri.getAuthority());
 }
}


3. activity_absolutepath.xml layout file

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="30dp" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Example code for get absolute path when select image from gallery"
        android:textSize="14sp"
        android:textStyle="bold" />

    <Button
        android:id="@+id/btn_selectImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:text="Select Image" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:textSize="14sp"
        android:textStyle="bold" />

</LinearLayout>

4. AndroidManifest.xml file

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

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.limbani.masterapp.AbsolutePathActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

5. ScreenShot




And Gallery image file Absolute path write in Log as per above code.

That's it, And it's working in Kitkat and  lower version too.

Doanload APK file Here

enjoy :)
Thank you.


Thursday, January 2, 2014

How to make a Skype Audio/Video call and Chat through intent in Android


Hello every one! Today I posting to Skype calls and message from our application. Just we need to open explicit default installed Skype application through Intent.


1. Focus Skype (Open Skype Application)
    
    Uri skypeUri = Uri.parse("skype:");
    Intent myIntent = new Intent(Intent.ACTION_VIEW, skypeUri);
    myIntent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main"));
    myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(myIntent);

2. Skype Chat

     Uri skypeUri = Uri.parse("skype:username?chat");
     Intent myIntent = new Intent(Intent.ACTION_VIEW, skypeUri);
     myIntent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main"));
     myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     startActivity(myIntent);

3. Skype Conference Chat with Topic

     Uri skypeUri = Uri.parse("skype:username1;username2?chat&topic=Android%20Chat");
     Intent myIntent = new Intent(Intent.ACTION_VIEW, skypeUri);
     myIntent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main"));
     myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     startActivity(myIntent);

4. Make a Skype call

     Uri skypeUri = Uri.parse("skype:username?call");
     Intent myIntent = new Intent(Intent.ACTION_VIEW, skypeUri);
     myIntent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main"));
     myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     startActivity(myIntent);

5. Make a Skype Video call

     Uri skypeUri = Uri.parse("skype:username?call&video=true");
     Intent myIntent = new Intent(Intent.ACTION_VIEW, skypeUri);
     myIntent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main"));
     myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     startActivity(myIntent); 
 
Example code here.

MainActivity.java Class file


import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity 
{
 // Make sure you are sign in skype application if you not then you need to sign in 
 @Override
 protected void onCreate(Bundle savedInstanceState) 
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  // Open skype button click event code here
  ((Button) findViewById(R.id.openskype)).setOnClickListener(new OnClickListener() 
  {
   @Override
   public void onClick(View v) 
   {
    String mySkypeUri = "skype:";
    SkypeUri(MainActivity.this, mySkypeUri);
   }
  });

  // skype message button click event code here
  ((Button) findViewById(R.id.skypemsg)).setOnClickListener(new OnClickListener() 
  { 
   @Override
   public void onClick(View v) 
   {
    String skypeName = ((EditText) findViewById(R.id.edt_skypeusername)).getText().toString().trim();
    if(skypeName.length()<=0)
    {
     Toast.makeText(getApplicationContext(), "Please enter skype username to message", Toast.LENGTH_SHORT).show();
    }
    else 
    {
     String mySkypeUri = "skype:"+skypeName+"?chat";
     SkypeUri(MainActivity.this, mySkypeUri);
    }
   }
  });

  // Skype Audio call button click event code here
  ((Button) findViewById(R.id.skypecall)).setOnClickListener(new OnClickListener() 
  {
   @Override
   public void onClick(View v) 
   {
    String skypeName = ((EditText) findViewById(R.id.edt_skypeusername)).getText().toString().trim();
    if(skypeName.length()<=0)
    {
     Toast.makeText(getApplicationContext(), "Please enter skype username to call", Toast.LENGTH_SHORT).show();
    }
    else {
     String mySkypeUri = "skype:"+skypeName+"?call";
     SkypeUri(MainActivity.this, mySkypeUri);
    }    
   }
  });

  // Skype Video call button click event code here
  ((Button) findViewById(R.id.skypevideocall)).setOnClickListener(new OnClickListener() 
  {
   @Override
   public void onClick(View v) 
   {
    String skypeName = ((EditText) findViewById(R.id.edt_skypeusername)).getText().toString().trim();
    if(skypeName.length()<=0)
    {
     Toast.makeText(getApplicationContext(), "Please enter skype username to video call", Toast.LENGTH_SHORT).show();
    }
    else 
    {
     String mySkypeUri = "skype:"+skypeName+"?call&video=true";
     SkypeUri(MainActivity.this, mySkypeUri);
    }    
   }
  });
 }

 public void SkypeUri(Context myContext, String mySkypeUri) {
  
  // Make sure the Skype for Android client is installed.
  if (!isSkypeClientInstalled(myContext)) {
   goToMarket(myContext);
   return;
  }
  Uri skypeUri = Uri.parse(mySkypeUri);
  Intent myIntent = new Intent(Intent.ACTION_VIEW, skypeUri);
  myIntent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main"));
  myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  myContext.startActivity(myIntent);

  return;
 }
 
 /**
  * Determine whether the Skype for Android client is installed on this device.
  */
 public boolean isSkypeClientInstalled(Context myContext) {
  PackageManager myPackageMgr = myContext.getPackageManager();
  try {
   myPackageMgr.getPackageInfo("com.skype.raider", PackageManager.GET_ACTIVITIES);
  }
  catch (PackageManager.NameNotFoundException e) {
   return (false);
  }
  return (true);
 }

 /**
  * Install the Skype client through the market: URI scheme.
  */
 
 public void goToMarket(Context myContext) {
  Uri marketUri = Uri.parse("market://details?id=com.skype.raider");
  Intent myIntent = new Intent(Intent.ACTION_VIEW, marketUri);
  myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  myContext.startActivity(myIntent);
  return;
 }
}


activity_main.xml XML layout file Here

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="15dp"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/skype_intent_handler"
        android:textSize="18sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/edt_skypeusername"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:ems="10"
        android:hint="Echo Testing skypeID - echo123" >
    </EditText>

    <Button
        android:id="@+id/openskype"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Open Skype" />

    <Button
        android:id="@+id/skypemsg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Skype Message" />

    <Button
        android:id="@+id/skypecall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Skype Audio Call" />

    <Button
        android:id="@+id/skypevideocall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="Skype Video Call" />

</LinearLayout>


AndroidManifest.xml

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.limbani.skypeintenthandler.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>



Note: Make sure you sign in Skype application. If not then open Skype application and sign in.

More information about Skype URIs are documented at: developer.skype.com/skype-uris-program/skype-uri-ref


Download Tutorial APK file ClickHere

Enjoy :)