2011-07-19 17 views
5

हो रही मैं एंड्रॉयड 2.2.1 पर ऑडियो रिकॉर्डर आह्वान करने के लिए कोशिश कर रहा हूँ (डिवाइस सैमसंग गैलेक्सी पीओपी) का उपयोग करते हुए निम्न कोड:ऑडियो रिकॉर्डर लागू और परिणामी फ़ाइल

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

यह सफलतापूर्वक रिकॉर्डर invokes। मेरी गतिविधि परिणाम में मैं निम्न कार्य करें:

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 है (जो गतिविधि है। RESULT_CANCELED) और मेरा डेटा शून्य है। क्या मैं यहाँ कुछ खो रहा हूँ? कृपया इसके साथ मेरी मदद करें। यह एमुलेटर पर काम करता है लेकिन डिवाइस पर नहीं। अग्रिम में धन्यवाद।

+0

ऑडियो रिकॉर्डर वास्तव में रिकॉर्ड आपके द्वारा किए गए है, जो जब यह onActivityResult को लौट जाना चाहिए उपयोग करने के लिए आप की पेशकश करनी चाहिए। – njzk2

उत्तर

0

अंत में मुझे फाइलऑब्सर्वर का उपयोग करके मेरी समस्या के लिए एक समाधान मिला। मैं ऐसा करके यह हासिल निम्नलिखित:

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()); 
     } 
    } 
}} 
0

मैं .. तो बजाय एक आशय का उपयोग करने का एक ही मुद्दा सामना करना पड़ रहा था, मैं MediaRecorder वर्ग और तरह setAudioEncoder, setAudioSource,, तैयार शुरू रोक, उसके संबंधित तरीकों का इस्तेमाल किया, setOutputFormat और setOutputFile..It अब ठीक काम करता है ..

-4

गैलेक्सी एंड्रॉइड डिवाइस के साथ एक ज्ञात समस्या है जहां परिणाम इरादे शून्य हैं जहां आप उन्हें एक फोटो रखने की उम्मीद करेंगे। यह यहां भी लागू हो सकता है। http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/ देखें। इस को हल करने के

एक तरह से, अपने इरादे को

intent.putExtra(MediaStore.EXTRA_OUTPUT, someFileUri); 

जोड़ने के लिए, स्पष्ट रूप से जहां परिणामी फ़ाइल स्टोर करने के लिए लक्ष्य एप्लिकेशन कह रहा है।

यदि आपको अच्छी फ़ाइल उरी बनाने में मदद की ज़रूरत है तो यह example देखें।

+1

क्या आपने इसे आजमाया? क्योंकि मैंने इसे आजमाया और ऐसा कोई प्रभाव नहीं दिखता है। मुझे लगता है कि ऑडियो रिकॉर्डिंग के लिए EXTRA_OUTPUT को अनदेखा किया गया है, इसका चित्र केवल चित्र लेने और वीडियो रिकॉर्डिंग के लिए प्रभाव पड़ता है। लेकिन हो सकता है मैं गलत हूं। –

+0

@EmmanuelTouzery आप नहीं हैं। दस्तावेज़ीकरण में यही कहा गया है: http://developer.android.com/reference/android/provider/MediaStore.html#EXTRA_OUTPUT – Pijusn

+0

यह ऑडियो फ़ाइलों के साथ काम नहीं करता है। – rcorbellini

0

मैं अब तक का सबसे अच्छा जवाब (प्रश्न-स्वामी द्वारा मतदान) से सहमत हूं, लेकिन यह फ़ाइल को नहीं पढ़ सकता क्योंकि यह एक अलग रास्ता है। मेरा सुझाव फ़ाइल नाम को सदस्य-चर के रूप में संग्रहीत करना है और केवल एक बार getFilename() को कॉल करना है।

2

यह मेरे लिए काम करता है:

@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); 
    } 
+0

धन्यवाद आपका उत्तर केवल यही था जिसने मेरी मदद की! – user1882196

संबंधित मुद्दे