org.alfresco.mobile.android.application.capture.AudioCapture.java Source code

Java tutorial

Introduction

Here is the source code for org.alfresco.mobile.android.application.capture.AudioCapture.java

Source

/*
 *  Copyright (C) 2005-2015 Alfresco Software Limited.
 *
 *  This file is part of Alfresco Mobile for Android.
 *
 *  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 org.alfresco.mobile.android.application.capture;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.alfresco.mobile.android.api.model.Folder;
import org.alfresco.mobile.android.api.utils.IOUtils;
import org.alfresco.mobile.android.application.R;
import org.alfresco.mobile.android.platform.AlfrescoNotificationManager;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

public class AudioCapture extends DeviceCapture {
    public static final String TAG = "AudioCapture";

    private static final long serialVersionUID = 1L;

    public AudioCapture(FragmentActivity parent, Folder folder) {
        this(parent, folder, null);
    }

    public AudioCapture(FragmentActivity parent, Folder folder, File parentFolder) {
        super(parent, folder, parentFolder);
        // Default MIME type if it cannot be retrieved from Uri later.
        mimeType = "audio/3gpp";
    }

    @Override
    public boolean hasDevice() {
        return (parentActivity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MICROPHONE));
    }

    @Override
    public boolean captureData() {
        if (hasDevice()) {
            try {
                Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
                if (intent.resolveActivity(context.getPackageManager()) == null) {
                    AlfrescoNotificationManager.getInstance(context).showAlertCrouton(parentActivity,
                            context.getString(R.string.feature_disable));
                    return false;
                } else {
                    parentActivity.startActivityForResult(intent, getRequestCode());
                }
            } catch (Exception e) {
                AlfrescoNotificationManager.getInstance(context).showAlertCrouton(parentActivity,
                        context.getString(R.string.no_voice_recorder));
                Log.d(TAG, Log.getStackTraceString(e));
                return false;
            }

            return true;
        } else {
            return false;
        }
    }

    @Override
    protected boolean payloadCaptured(int requestCode, int resultCode, Intent data) {
        Uri savedUri = data.getData();

        try {
            File folder = parentFolder;
            if (folder != null) {
                String filePath = getAudioFilePathFromUri(savedUri);
                String fileType = getAudioFileTypeFromUri(savedUri);
                String newFilePath = folder.getPath() + "/"
                        + createFilename("AUDIO", filePath.substring(filePath.lastIndexOf(".") + 1));

                copyFile(filePath, newFilePath);

                parentActivity.getContentResolver().delete(savedUri, null, null);
                (new File(filePath)).delete();

                payload = new File(newFilePath);

                if (!fileType.isEmpty()) {
                    mimeType = fileType;
                }

                return true;
            } else {
                AlfrescoNotificationManager.getInstance(parentActivity)
                        .showLongToast(parentActivity.getString(R.string.sdinaccessible));
                return false;
            }
        } catch (IOException e) {
            AlfrescoNotificationManager.getInstance(context)
                    .showLongToast(context.getString(R.string.cannot_capture));
            Log.d(TAG, Log.getStackTraceString(e));
            return false;
        }
    }

    private String getAudioFilePathFromUri(Uri uri) {
        Cursor cursor = parentActivity.getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            int index = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DATA);

            return (index != -1 ? cursor.getString(index) : "");
        } else {
            return "";
        }
    }

    private String getAudioFileTypeFromUri(Uri uri) {
        Cursor cursor = parentActivity.getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            int index = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.MIME_TYPE);
            return (index != -1 ? cursor.getString(index) : "");
        } else {
            return "";
        }
    }

    private void copyFile(String fileName, String newFileName) throws IOException {
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(fileName);
            out = new FileOutputStream(newFileName);

            // Transfer bytes from in to out
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        } catch (Exception e) {
            throw new IOException("Error during copy file", e);
        } finally {
            IOUtils.closeStream(in);
            IOUtils.closeStream(out);
        }
    }

    public int getRequestCode() {
        return 302;
    }
}