Android 从onActivityResult检索数组

Android 从onActivityResult检索数组,android,arrays,fft,onactivityresult,Android,Arrays,Fft,Onactivityresult,我在一个Android项目上使用FFT,只需要将录音写入缓冲区3秒钟。因为,在捕获过程中我不需要任何更新,我没有使用AsyncTask 当我开始处理时,toTransform长度和表达式类型会出现错误。我缺少什么来让这些部件工作,还是我走错了方向 另外,这些都是异步任务 package com.example.learnfft; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; im

我在一个Android项目上使用FFT,只需要将录音写入缓冲区3秒钟。因为,在捕获过程中我不需要任何更新,我没有使用AsyncTask

当我开始处理时,toTransform长度和表达式类型会出现错误。我缺少什么来让这些部件工作,还是我走错了方向

另外,这些都是异步任务

package com.example.learnfft;



import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity; 
import android.content.Intent;
import android.media.AudioFormat; 
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle; 
import android.os.Handler;
import android.util.Log;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
//import android.widget.Toast;
import ca.uol.aig.fftpack.RealDoubleFFT;



public class Main extends Activity implements OnClickListener {

    public int channelConfiguration = AudioFormat.CHANNEL_IN_MONO; 
    public int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; 

    //FFT
    private RealDoubleFFT transformer;
    int blockSize = 1024;
    Button startStopButton;
    int frequency = 44100;
    int requestcode;
    boolean started = false;
    double freq;
    double[] magnitude;
    short[] buffer = new short[blockSize];
    double[] toTransform = new double[blockSize];


    //Create thread Handler
    Handler handler = new Handler();
    int bufferSize = AudioRecord.getMinBufferSize(frequency,
            channelConfiguration, audioEncoding);
    Timer timer = new Timer();
    AudioRecord audioRecord = new AudioRecord(
            MediaRecorder.AudioSource.MIC, frequency,
            channelConfiguration, audioEncoding, bufferSize);

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

        Button button = (Button) findViewById(R.id.takeTemp);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent i = new Intent(this,recordAudio.class);
        startActivityForResult(i,requestcode);
        //recordAudio(toTransform);
        FindFrequency();
    }

    public void FindFrequency() {

        try { 
            audioRecord.startRecording();

            int bufferReadResult = audioRecord.read(buffer, 0, blockSize);

            for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                toTransform[i] = (double) buffer[i] / 32768.0; // signed // 16 // bit

            }

             timer.schedule(new TimerTask() {
                 public void run() {
                     handler.post(new Runnable() {
                         public void run() {
                             audioRecord.stop();
                         }
                     });
                 }
             }, 3000); //Stop after 3 seconds
        } catch (Throwable t) {
            Log.e("AudioRecord", "Recording Failed");
        }
        File freqFile = new File("/mnt/sdcard/Test APKs/frequency.file");
        File magFile = new File("/mnt/sdcard/Test APKs/magnitude.file");
        int blockSize = 256;
        double[] audioDataDoubles = new double[(blockSize*2)];
        String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());



        transformer.ft(toTransform);

        for ( int x = 0; x < toTransform[0].length; x++) {  <-- Length error
            audioDataDoubles[2*x] = toTransform[0][x];      <-- is array but it must resolve to double.
            audioDataDoubles[(2*x)+1] = 0.0;
        }
        double[] re = new double[blockSize];
        double[] im = new double[blockSize];
        double[] magnitude = new double[blockSize];

        // Calculate the Real and imaginary and Magnitude.
        for(int i = 0; i < blockSize; i++){
            // real is stored in first part of array
            re[i] = audioDataDoubles[i*2];
            // imaginary is stored in the sequential part
            im[i] = audioDataDoubles[(2*i)+1];
            // magnitude is calculated by the square root of (imaginary^2 + real^2)
            magnitude[i] = Math.sqrt((re[i] * re[i]) + (im[i]*im[i]));
        }

        double peak = -1.0; 
        // Get the largest magnitude peak
        for(int i = 0; i < blockSize; i++){ 
            if(peak < magnitude[i])
                peak = magnitude[i];
                String magValue = String.valueOf(peak);
            try {
                BufferedWriter buf = new BufferedWriter(new FileWriter(magFile, true));
                buf.append(mydate + " - " + magValue);
                buf.newLine();
                buf.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
             }
        }
        // calculated the frequency
        freq = (frequency * peak)/blockSize;
        String freqValue = String.valueOf(freq);
        //Toast.makeText(Main.this, freqValue, Toast.LENGTH_SHORT).show();
        try {
            BufferedWriter buf = new BufferedWriter(new FileWriter(freqFile, true));
            buf.append(mydate + " - " + freqValue);
            buf.newLine();
            buf.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         } 
    }    
}
package com.example.learnfft;
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.util.Calendar;
导入java.util.Timer;
导入java.util.TimerTask;
导入android.app.Activity;
导入android.content.Intent;
导入android.media.AudioFormat;
导入android.media.AudioRecord;
导入android.media.MediaRecorder;
导入android.os.Bundle;
导入android.os.Handler;
导入android.util.Log;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
//导入android.widget.Toast;
进口ca.uol.aig.fftpack.RealDoubleFFT;
公共类主扩展活动实现OnClickListener{
public int channelConfiguration=单声道中的AudioFormat.CHANNEL\u;
public int audioEncoding=AudioFormat.ENCODING_PCM_16位;
//快速傅里叶变换
专用FFT变压器;
int blockSize=1024;
按钮启动按钮;
int频率=44100;
int请求码;
布尔值=false;
双频;
双[]量级;
short[]buffer=新的short[blockSize];
double[]toTransform=新的double[blockSize];
//创建线程处理程序
Handler=newhandler();
int bufferSize=AudioRecord.getMinBufferSize(频率,
信道配置、音频编码);
定时器=新定时器();
音频记录=新的音频记录(
MediaRecorder.AudioSource.MIC,频率,
信道配置、音频编码、缓冲区大小);
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
按钮按钮=(按钮)findViewById(R.id.takeTemp);
setOnClickListener(此);
}
@凌驾
公共void onClick(视图v){
意图i=新意图(此,recordAudio.class);
startActivityForResult(i,请求代码);
//录制音频(转换);
FindFrequency();
}
公共无效FindFrequency(){
试试{
录音。开始录制();
int bufferReadResult=audioRecord.read(缓冲区,0,块大小);
对于(int i=0;i你可以在change
toTransform[0]中找到更多细节。length
toTransform.length
以及什么是
toTransform
?2d数组?我不太清楚,但你能试着编写super.onActivityResult(请求代码、结果代码、数据);在找到频率(toTransform)之后,你能检查一下toTransform是否是double[]在这两个地方。谢谢你的建议,但没有一个有效。我已经将它合并到一个文件中,但仍然得到相同的错误。我已经将完整的代码放在abve。谢谢,但这并没有解决我收到的错误。我已经重新编写了上面的问题,并将所有内容合并到一个signe程序中。
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data)
{
     super.onActivityResult(requestCode, resultCode, data);
     If(requestCode==requestcode){ 
         //requestcode is request code that you send with intent on   startActivityForResult(i,requestcode);
         //Your code here
         double[] toTransform = data.getDoubleArrayExtra("audioBuffer");
         FindFrequency(toTransform);
     }
}