2016-01-06 27 views
-1

我开始有这个错误,当我让一个Intent尝试从ActMain传递一个字符串到SoundClsRslt时,通过在SoundClsRslt中添加“extend Activity”并在清单中声明。在清单中没有默认的构造函数

我的应用程序保持崩溃和它说:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Hugler/com.Hugler.ActMain}: 
android.content.ActivityNotFoundException: Unable to find explicit activity class {/com.Hugler.CB.SoundClsRslt}; 
have you declared this activity in your AndroidManifest.xml? 

我宣布我的Android清单文件中的活动,但有一个错误说“‘com.Hugler.CB.SoundClsRslt’没有默认构造函数”

<uses-feature android:name="android.hardware.usb." /> 
<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission> 
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/Hugler" 
    android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" > 
    <activity 
     android:name="com.Hugler.ActMain" 
     android:label="@string/Hugler" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name="com.Hugler.CB.SoundClsRslt" /> 
</application> 

这里是我的SoundClsRslt代码:

package com.Hugler.CB; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.ShortBuffer; 
import java.nio.channels.FileChannel; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 

import com.Hugler.ActMain; 
import com.Hugler.TeleOp.TeleOp; 
import com.SoundClassification.SoundClassification.ISC; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Environment; 
import android.telephony.SmsManager; 

public class SoundClsRslt extends Activity implements ISC { 

    public static int interact; 

    private ActMain m_pMain; 
    private static int m_iID; 
    private static int m_iID1; 
    private FileOutputStream _fLog; 

    public SoundClsRslt(ActMain pMain) { 
     m_pMain = pMain; 
     m_iID = 0; 
     m_iID1 = 0; 
     _fLog = null; 
    } 

    public void StartLog(String sFile) { 
     if (_fLog != null) 
      return; 
     try { 
      _fLog = new FileOutputStream(sFile); 
      String sHdr = "Time,Event,Confidence\n"; 
      _fLog.write(sHdr.getBytes()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void OnLog(String sLog) { 
    } 

    public void OnLog2(String sLog) { 
    } 

    public void OnSegment(double[] pBuf, int iLen, String sCls, double dConf) { 
     sCls = sCls.toLowerCase(Locale.getDefault()); 
     { 
      if (sCls.contains("glass")) { 

       m_iID1++; 
       m_pMain.Show2(m_iID1 + "." + sCls); 
       m_pMain.Show3("" + dConf); 

       //convert short to byte 
       ByteBuffer myByteBuffer = ByteBuffer.allocate(iLen * 2); 
       myByteBuffer.order(ByteOrder.LITTLE_ENDIAN); 

       //open pcm 
       ShortBuffer myShortBuffer = myByteBuffer.asShortBuffer(); 
       for (int i = 0; i < iLen ; i++) { 
        myShortBuffer.put((short)(pBuf[i])); 
       } 
       File file; 

       FileChannel out = null; 

       try { 
        String filepath = Environment.getExternalStorageDirectory().getPath(); 
        SimpleDateFormat pSDF = new SimpleDateFormat("yyyyMMdd_HH_mm_ss", Locale.UK); 
        String sNow = pSDF.format(new Date()); 
        file = new File(filepath,"AudioRecorder" + "/segment_" + sNow + ".pcm"); 

        Intent intent = getIntent(); 

        SimpleDateFormat smsdate = new SimpleDateFormat("yyyy/MM/dd_HH:mm:ss", Locale.US); 
        String messageToSend = "Glass breaking sound detected at "+ smsdate.format(new Date()) + " (yyyy/MM/dd_HH:mm:ss)"; 
        String number = intent.getExtras().getString("numberfrom"); 
        SmsManager.getDefault().sendTextMessage(number, null, messageToSend, null, null); 

        // if file doesnt exists, then create it 
        if (!file.exists()) { 
         file.createNewFile(); 
        } 
        out = new FileOutputStream(file).getChannel(); 

        //write to pcm 
        out.write(myByteBuffer); 
        //close pcm 
        out.close(); 
       } catch (IOException e) { 
      e.printStackTrace(); 
       } finally { 
        try { 
         if (out != null) { 
          out.close(); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 

      } else { 
      m_iID++; 
      m_pMain.Show0(m_iID + "." + sCls); 
       m_pMain.Show1("" + dConf); 
      } 
     } 
     TeleOp.SendInteraction(); 

     if (_fLog != null) { 
      SimpleDateFormat pSDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); 
      String sNow = pSDF.format(new Date()); 
      String sLog = sNow + "," + sCls + "," + dConf + "\n"; 
      try { 
       _fLog.write(sLog.getBytes()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

如何以及在哪里添加空的构造函数?提前致谢! :)

其他。我ActMain代码:

package com.Hugler; 

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 

import com.Audio.CAudio; 
import com.Hugler.ADK.ADK; 
import com.Hugler.CB.SoundClsRslt; 
import com.Hugler.Lib.Cfg; 
import com.Hugler.Lib.MyDebug; 
import com.Hugler.Network.Server; 
import com.Hugler.Network.StreamingServer; 

import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.telephony.SmsManager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.Hugler.Personality.Personality; 
import com.Hugler.Personality.Miti.PerMiti; 
import com.Hugler.TeleOp.TeleOp; 
import com.Motor.Motor; 
import com.TTS.PCMPlayback; 

public class ActMain extends Activity implements ADK.IADK { 
    private TextView m_pTxtRslt; 
    private TextView m_pTxtRslt1; 

    private TextView m_pTxtview; 
    private TextView m_pTxtview1; 

    public static Button m_pBtnHeadToggle; 
    public static Button m_pBtnEarToggle; 

    private SoundClsRslt m_pSoundClsRslt; 
    private static ActMain _p; 

    public static int level; 

    final Intent i = new Intent(this, SoundClsRslt.class); 
    final Context context = this; 
    private TextView result; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 



     _p = this; 

     if (Cfg.Init()) { 
      setContentView(R.layout.main); 

      // get prompts.xml view 
      LayoutInflater li = LayoutInflater.from(context); 
      View promptsView = li.inflate(R.layout.prompts, null); 

      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
        context); 

      // set prompts.xml to alertdialog builder 
      alertDialogBuilder.setView(promptsView); 

      final EditText userInput = (EditText) promptsView 
        .findViewById(R.id.editTextDialogUserInput); 

      // set dialog message 
      alertDialogBuilder 
        .setCancelable(false) 
        .setPositiveButton("OK", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int id) { 
            // get user input and set it to result 
            // edit text 
            result.setText(userInput.getText()); 
           } 

          }) 
        .setNegativeButton("Cancel", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, int id) { 
            dialog.cancel(); 
           } 
          }); 

      // create alert dialog 
      AlertDialog alertDialog = alertDialogBuilder.create(); 

      // show it 
      alertDialog.show(); 

      result = (TextView) findViewById(R.id.editTextResult); 
      result.setText(null); 

      m_pTxtRslt = (TextView) findViewById(R.id.TxtRslt); 
      m_pTxtRslt1 = (TextView) findViewById(R.id.TxtRslt1); 

      m_pTxtview = (TextView) findViewById(R.id.textView2); 
      m_pTxtview1 = (TextView) findViewById(R.id.textView3); 

      MyDebug.Init(this, m_pTxtRslt); 

      m_pTxtRslt.setText("Non-Glass"); 
      m_pTxtRslt1.setText(null); 

      m_pTxtview.setText("Glass"); 
      m_pTxtview1.setText(null); 

      m_pSoundClsRslt = new SoundClsRslt(this); 
      SimpleDateFormat pSDF = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US); 
      String sNow = pSDF.format(new Date()); 
      m_pSoundClsRslt.StartLog(Cfg.GetLogDir() + "/" + sNow + ".csv"); 

      PCMPlayback.Init(); 
      Personality.Init(new PerMiti()); 
      TeleOp.Init(m_pSoundClsRslt); 

      if (result != null){ 

       String easyPuzzle = result.getText().toString(); 
       i.putExtra("numberfrom", easyPuzzle); 
       startActivity(i); 
       Toast.makeText(this, "msg msg", Toast.LENGTH_SHORT).show(); 
      } // passing the string 

     } else { 
      AlertDialog.Builder pDlg = new AlertDialog.Builder(this); 
      pDlg.setTitle("Fail loading configuration"); 
      pDlg.setMessage(Cfg.ErrMsg()); 
      pDlg.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        ActMain.this.finish(); 
       } 
      }); 
      pDlg.show(); 
     } 
    } 

    protected void onResume() { 
     super.onResume(); 
     if (Cfg.ErrMsg() != null) 
      return; 

     Server.Init(); 
      CAudio.Init(m_pSoundClsRslt); 
      CAudio.ResumeSoundCls(); 

     View decorView = getWindow().getDecorView(); 

     int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
     decorView.setSystemUiVisibility(uiOptions); 
    } 

    public void Show0(final String sTxt) { 
     runOnUiThread(new Runnable() { 
      public void run() { 
       m_pTxtRslt.setText(sTxt); 
      } 
     }); 
    } 

    public void Show1(final String sTxt) { 

     runOnUiThread(new Runnable() { 
      public void run() { 
       m_pTxtRslt1.setText(sTxt); 
      } 
     }); 
    } 

    public void Show2(final String sTxt) { 
     runOnUiThread(new Runnable() { 
      public void run() { 
       m_pTxtview.setText(sTxt); 
      } 
     }); 
    } 

    public void Show3(final String sTxt) { 
     runOnUiThread(new Runnable() { 
      public void run() { 
       m_pTxtview1.setText(sTxt); 
      } 
     }); 
    } 

    public void OnADKStat(int iStat, String sMsg) { 

     if (iStat == ADK.S_CONNECTED) 
      Motor.Connect(ADK.GetInStream(), ADK.GetOutStream()); 
     else if (iStat == ADK.S_DISCONNECTED) 
      runOnUiThread(new Runnable() { 
       public void run() { 
        Motor.Disconnect(); 
        ActMain.this.finish(); 
       } 
      }); 
    } 
} 
+0

无法实例使用'new'关键字的'Activity'。你在做这个:'m_pSoundClsRslt = new SoundClsRslt(this);'只有Android框架可以实例化一个Android组件('Activity,Service,BroadcastReceiver,Provider')。你为什么做这个? –

回答

0

Activity 添加空的构造类似下面

public SoundClsRslt(){} 

正如你所提到的参数化的构造

强烈建议不要使用参数化constructo为Activity/Fragment通数据使用Intent

public SoundClsRslt(ActMain pMain) { 
       m_pMain = pMain; 
       m_iID = 0; 
       m_iID1 = 0; 
       _fLog = null; 
      } 

相关问题