【问题标题】:Invoking audio recorder and getting the resulting file调用录音机并获取结果文件
【发布时间】:2013-02-22 02:18:16
【问题描述】:

我正在尝试使用以下代码在 Android 2.2.1(设备三星 Galaxy POP)上调用录音机:

private static final int ACTIVITY_RECORD_SOUND = 1;
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
startActivityForResult(intent, ACTIVITY_RECORD_SOUND);

这将成功调用记录器。在我的活动结果中,我执行以下操作:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        switch (requestCode) {
                         case ACTIVITY_RECORD_SOUND:
                             data.getDataString();
                         break;
                            }
                }
       }

完成录制后,我按回录音机,该录音机按预期将控件返回到 onActivityResult 方法,但我的 resultCode 始终为 0(即 Activity.RESULT_CANCELED)并且我的数据为空。我在这里错过了什么吗?请帮我解决这个问题。这适用于模拟器,但不适用于设备。提前致谢。

【问题讨论】:

  • 录音机应该让你实际使用你所做的记录,也就是它应该返回到onActivityResult的时间。

标签: android


【解决方案1】:

这对我有用:

   @Override protected void onActivityResult(int requestCode, int resultCode, Intent data)
   {
      switch(requestCode) {
         case Flashum.TAKE_MUSIC:
         case Flashum.TAKE_VOICE:
            if (resultCode == Activity.RESULT_OK)
            {
               Log.i(Flashum.LOG_TAG, "onActivityResult got new music");
               Bundle extras = data.getExtras();
               try {
                  Uri u = data.getData();
                  String imageUri;
                  try {
                     imageUri = getRealPathFromURI(u);
                  } catch (Exception ex) {
                     imageUri = u.getPath();
                  }
                  File file = new File(imageUri);
                  FragmentFlash fragmentFlash = (FragmentFlash)mTabsAdapter.getFragment("flash");
                  if (fragmentFlash != null)
                     fragmentFlash.gotMusic(file.getPath());
               } catch (Exception ex) {
                  String s = ex.toString();
                  Log.i(Flashum.LOG_TAG, "onActivityResult " + s);
               }
            }
            else
            {
               Log.i(Flashum.LOG_TAG, "onActivityResult Failed to get music");
            }
            break;
      }
   }

   public String getRealPathFromURI(Uri contentUri) {
      String[] proj = { MediaStore.Images.Media.DATA };
      Cursor cursor = managedQuery(contentUri, proj, null, null, null);
      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
      cursor.moveToFirst();
      return cursor.getString(column_index);
   }

【讨论】:

  • 谢谢你的回答是唯一帮助我的人!
【解决方案2】:

我终于通过使用 FileObserver 找到了解决我的问题的方法。我通过执行以下操作实现了它:

package com.pravaa.audiointent;

 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Enumeration;
 import java.util.Vector;

 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.FileObserver;
 import android.provider.MediaStore;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.LinearLayout;
 import android.widget.Toast;

public class AudioActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private Button sampleButton;
private FileObserver mFileObserver;
private Vector<String> audioFileNames;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    audioFileNames = new Vector<String>();
    LinearLayout finalContainer = new LinearLayout(this);
    sampleButton = new Button(this);
    sampleButton.setOnClickListener(this);
    sampleButton.setText("Start Audio Intent");
    finalContainer.addView(sampleButton);
    setContentView(finalContainer);
    addObserver();

}

private void addObserver() {
    this.mFileObserver = new FileObserver("/sdcard/Sounds/") {
        @Override
        public void onEvent(int event, String path) {
            if (event == FileObserver.CREATE) {
                if (path != null) {
                    int index = path.indexOf("tmp");
                    String tempFileName = (String) path.subSequence(0,
                            index - 1);
                    audioFileNames.add(tempFileName);

                }
            } else if (event == FileObserver.DELETE) {
                if (path != null) {
                    int index = path.indexOf("tmp");
                    String tempFileName = (String) path.subSequence(0,
                            index - 1);
                    if (audioFileNames.contains(tempFileName)) {
                        audioFileNames.remove(tempFileName);
                    }
                }

            }
        }
    };
}

private void readFile(String fileName) {

    File attachment = new File("/sdcard/Sounds/" + fileName);
    if (attachment.exists()) {
        FileInputStream fis;
        try {
            fis = new FileInputStream(attachment);
            byte[] bytes = new byte[(int) attachment.length()];
            try {
                fis.read(bytes);
                fis.close();

                attachment.delete();

                saveMedia("Test" + fileName, bytes);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    mFileObserver.startWatching();
}

public void saveMedia(String fileName, byte[] data) {

    String imagePath = "/sdcard/sam/";
    System.out.println("Inside Folder");


    File file = new File(imagePath, fileName);
    System.out.println("File Created");

    FileOutputStream fileOutputStream = null;
    try {
        fileOutputStream = new FileOutputStream(file);
        DataOutputStream dataOutputStream = new DataOutputStream(
                fileOutputStream);
        System.out.println("Writting File");
        dataOutputStream.write(data, 0, data.length);
        System.out.println("Finished writting File");
        dataOutputStream.flush();
        dataOutputStream.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void onClick(View arg0) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
    startActivityForResult(intent, 2); 
}

@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    // TODO Auto-generated method stub
    if (requestCode == 2) {
        if (mFileObserver != null) {
            mFileObserver.stopWatching();
        }
        Enumeration<String> audioFileEnum = audioFileNames.elements();
        while (audioFileEnum.hasMoreElements()) {
            readFile((String) audioFileEnum.nextElement());
        }
    }
}}

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。所以我没有使用意图,而是使用了 MediaRecorder 类及其相关方法,如 setAudioEncoder、setAudioSource、prepare、start、stop、setOutputFormat 和 setOutputFile..它现在可以正常工作了..

    【讨论】:

      【解决方案4】:

      我也同意迄今为止的最佳答案(由问题所有者投票),但它无法读取文件,因为它是不同的路径。我的建议是将文件名存储为成员变量并仅调用一次 getFilename()。

      【讨论】:

        【解决方案5】:

        Galaxy Android 设备存在一个已知问题,即结果 Intent 为 null,您希望它们包含照片。这也可能适用于此。见http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/

        解决这个问题的一种方法是添加

        intent.putExtra(MediaStore.EXTRA_OUTPUT, someFileUri);
        

        根据您的意图,明确告诉目标应用程序将生成的文件存储在哪里。

        如果您需要帮助创建一个好的文件 Uri,请查看此 example

        【讨论】:

        • 你试过了吗?因为我这里试过了,好像没有效果。我认为EXTRA_OUTPUT对于录音是被忽略的,它只对拍照和录像有影响。但我可能错了。
        • @EmmanuelTouzery 你不是。这正是文档中所述:developer.android.com/reference/android/provider/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-17
        • 1970-01-01
        相关资源
        最近更新 更多