All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dmitriy.tarasov.android.intents.IntentUtils Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2013 Dmitriy Tarasov
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.dmitriy.tarasov.android.intents;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.provider.Contacts;
import android.provider.MediaStore;
import android.provider.Settings;
import android.text.TextUtils;

import java.io.File;
import java.net.URL;
import java.util.List;

/**
 * @author Dmitriy Tarasov
 */
public class IntentUtils {

    /**
     * Open app page at Google Play
     *
     * @param context Application context
     */
    public static Intent openPlayStore(Context context) {
        String appPackageName = context.getPackageName();
        return new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName));
    }

    /**
     * Send email message
     *
     * @param to      Receiver email
     * @param subject Message subject
     * @param text    Message body
     * @see #sendEmail(String[], String, String)
     */
    public static Intent sendEmail(String to, String subject, String text) {
        return sendEmail(new String[]{to}, subject, text);
    }

    /**
     * @see #sendEmail(String, String, String)
     */
    public static Intent sendEmail(String[] to, String subject, String text) {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("message/rfc822");
        intent.putExtra(Intent.EXTRA_EMAIL, to);
        intent.putExtra(Intent.EXTRA_SUBJECT, subject);
        intent.putExtra(Intent.EXTRA_TEXT, text);
        return intent;
    }

    /**
     * Share text via thirdparty app like twitter, facebook, email, sms etc.
     *
     * @param subject Optional subject of the message
     * @param text    Text to share
     */
    public static Intent shareText(String subject, String text) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_SEND);
        if (!TextUtils.isEmpty(subject)) {
            intent.putExtra(Intent.EXTRA_SUBJECT, subject);
        }
        intent.putExtra(Intent.EXTRA_TEXT, text);
        intent.setType("text/plain");
        return intent;
    }

    /**
     * Send SMS message using built-in app
     *
     * @param to      Receiver phone number
     * @param message Text to send
     */
    public static Intent sendSms(String to, String message) {
        Uri smsUri = Uri.parse("tel:" + to);
        Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);
        intent.putExtra("address", to);
        intent.putExtra("sms_body", message);
        intent.setType("vnd.android-dir/mms-sms");
        return intent;
    }

    /**
     * Opens the Street View application to the given location.
     * The URI scheme is based on the syntax used for Street View panorama information in Google Maps URLs.
     *
     * @param latitude  Latitude
     * @param longitude Longitude
     * @param yaw       Panorama center-of-view in degrees clockwise from North.
     *                  

* Note: The two commas after the yaw parameter are required. * They are present for backwards-compatibility reasons. * @param pitch Panorama center-of-view in degrees from -90 (look straight up) to 90 (look straight down.) * @param zoom Panorama zoom. 1.0 = normal zoom, 2.0 = zoomed in 2x, 3.0 = zoomed in 4x, and so on. * A zoom of 1.0 is 90 degree horizontal FOV for a nominal landscape mode 4 x 3 aspect ratio display Android * phones in portrait mode will adjust the zoom so that the vertical FOV is approximately the same as the * landscape vertical FOV. This means that the horizontal FOV of an Android phone in portrait mode is much * narrower than in landscape mode. This is done to minimize the fisheye lens effect that would be present * if a 90 degree horizontal FOV was used in portrait mode. * @param mapZoom The map zoom of the map location associated with this panorama. * This value is passed on to the Maps activity when the Street View "Go to Maps" menu item is chosen. * It corresponds to the zoomLevel parameter in {@link #showLocation(float, float, Integer)} */ public static Intent showStreetView(float latitude, float longitude, Float yaw, Integer pitch, Float zoom, Integer mapZoom) { StringBuilder builder = new StringBuilder("google.streetview:cbll=").append(latitude).append(",").append(longitude); if (yaw != null || pitch != null || zoom != null) { String cbpParam = String.format("%s,,%s,%s", yaw == null ? "" : yaw, pitch == null ? "" : pitch, zoom == null ? "" : zoom); builder.append("&cbp=1,").append(cbpParam); } if (mapZoom != null) { builder.append("&mz=").append(mapZoom); } Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(builder.toString())); return intent; } /** * Opens the Maps application to the given location. * * @param latitude Latitude * @param longitude Longitude * @param zoomLevel A zoom level of 1 shows the whole Earth, centered at the given lat,lng. * A zoom level of 2 shows a quarter of the Earth, and so on. The highest zoom level is 23. * A larger zoom level will be clamped to 23. * @see #findLocation(String) */ public static Intent showLocation(float latitude, float longitude, Integer zoomLevel) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); String data = String.format("geo:%s,%s", latitude, longitude); if (zoomLevel != null) { data = String.format("%s?z=%s", data, zoomLevel); } intent.setData(Uri.parse(data)); return intent; } /** * Opens the Maps application to the given query. * * @param query Query string * @see #showLocation(float, float, Integer) */ public static Intent findLocation(String query) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); String data = String.format("geo:0,0?q=%s", query); intent.setData(Uri.parse(data)); return intent; } /** * Open system settings location services screen for turning on/off GPS */ public static Intent showLocationServices() { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); return intent; } /** * Open a browser window to the URL specified. * * @param url Target url */ public static Intent openLink(String url) { // if protocol isn't defined use http by default if (!TextUtils.isEmpty(url) && !url.contains("://")) { url = "http://" + url; } Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); return intent; } /** * @see #openLink(String) */ public static Intent openLink(URL url) { return openLink(url.toString()); } /** * Open a video file in appropriate app * * @param file File to open */ public static Intent openVideo(File file) { return openVideo(Uri.fromFile(file)); } /** * @see #openVideo(java.io.File) */ public static Intent openVideo(String file) { return openVideo(new File(file)); } /** * @see #openVideo(java.io.File) */ public static Intent openVideo(Uri uri) { return openMedia(uri, "video/*"); } /** * Open an audio file in appropriate app * * @param file File to open */ public static Intent openAudio(File file) { return openAudio(Uri.fromFile(file)); } /** * @see #openAudio(java.io.File) */ public static Intent openAudio(String file) { return openAudio(new File(file)); } /** * @see #openAudio(java.io.File) */ public static Intent openAudio(Uri uri) { return openMedia(uri, "audio/*"); } /** * Open an image file in appropriate app * * @param file File to open */ public static Intent openImage(String file) { return openImage(new File(file)); } /** * @see #openImage(String) */ public static Intent openImage(File file) { return openImage(Uri.fromFile(file)); } /** * @see #openImage(String) */ public static Intent openImage(Uri uri) { return openMedia(uri, "image/*"); } /** * Open a text file in appropriate app * * @param file File to open */ public static Intent openText(String file) { return openText(new File(file)); } /** * @see #openText(String) */ public static Intent openText(File file) { return openText(Uri.fromFile(file)); } /** * @see #openText(String) */ public static Intent openText(Uri uri) { return openMedia(uri, "text/plain"); } /** * Pick file from sdcard with file manager. Chosen file can be obtained from Intent in onActivityResult. * See code below for example: *

*


     *     @Override
     *     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     *         Uri file = data.getData();
     *     }
     * 
*/ public static Intent pickFile() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("file/*"); return intent; } /** * Calls the entered phone number. Valid telephone numbers as defined in the IETF RFC 3966 are accepted. * Valid examples include the following: * tel:2125551212 * tel: (212) 555 1212 *

* Note: This requires your application to request the following permission in your manifest: * <uses-permission android:name="android.permission.CALL_PHONE"/> * * @param phoneNumber Phone number */ public static Intent callPhone(String phoneNumber) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + phoneNumber)); return intent; } /** * Pick contact from phone book */ public static Intent pickContact() { return pickContact(null); } /** * Pick contact from phone book * * @param scope You can restrict selection by passing required content type. Examples: *

*

     *              // Select only from users with emails
     *              IntentUtils.pickContact(ContactsContract.CommonDataKinds.Email.CONTENT_TYPE);
     *              

* // Select only from users with phone numbers on pre Eclair devices * IntentUtils.pickContact(Contacts.Phones.CONTENT_TYPE); *

* // Select only from users with phone numbers on devices with Eclair and higher * IntentUtils.pickContact(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); *

*/ public static Intent pickContact(String scope) { Intent intent; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ECLAIR) { intent = new Intent(Intent.ACTION_PICK, Contacts.People.CONTENT_URI); } else { intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://com.android.contacts/contacts")); } if (!TextUtils.isEmpty(scope)) { intent.setType(scope); } return intent; } /** * Dials (but does not actually initiate the call) the number given. * Telephone number normalization described for {@link #callPhone(String)} applies to dial as well. * * @param phoneNumber Phone number */ public static Intent dialPhone(String phoneNumber) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); return intent; } /** * Check that cropping application is available * * @param context Application context * @return true if cropping app is available * @see #cropImage(android.content.Context, java.io.File, int, int, int, int, boolean) */ public static boolean isCropAvailable(Context context) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setType("image/*"); return IntentUtils.isIntentAvailable(context, intent); } /** * Crop image. Before using, cropImage requires especial check that differs from * {@link #isIntentAvailable(android.content.Context, android.content.Intent)} * see {@link #isCropAvailable(android.content.Context)} instead * * @param context Application context * @param image Image that will be used for cropping. This image is not changed during the cropImage * @param outputX Output image width * @param outputY Output image height * @param aspectX Crop frame aspect X * @param aspectY Crop frame aspect Y * @param scale Scale or not cropped image if output image and cropImage frame sizes differs * @return Intent with data-extra in onActivityResult which contains result as a * {@link android.graphics.Bitmap}. See demo app for details */ public static Intent cropImage(Context context, File image, int outputX, int outputY, int aspectX, int aspectY, boolean scale) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setType("image/*"); List list = context.getPackageManager().queryIntentActivities(intent, 0); ResolveInfo res = list.get(0); intent.putExtra("outputX", outputX); intent.putExtra("outputY", outputY); intent.putExtra("aspectX", aspectX); intent.putExtra("aspectY", aspectY); intent.putExtra("scale", scale); intent.putExtra("return-data", true); intent.setData(Uri.fromFile(image)); intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); return intent; } /** * Call standard camera application for capturing an image * * @param file Full path to captured file */ public static Intent photoCapture(String file) { Uri uri = Uri.fromFile(new File(file)); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); return intent; } /** * Check that in the system exists application which can handle this intent * * @param context Application context * @param intent Checked intent * @return true if intent consumer exists, false otherwise */ public static boolean isIntentAvailable(Context context, Intent intent) { PackageManager packageManager = context.getPackageManager(); List list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; } private static Intent openMedia(Uri uri, String mimeType) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, mimeType); return intent; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy