当我通过在SoundClsRslt中添加“extend Activity”并在清单中声明时,我尝试将一个字符串从ActMain传递到SoundClsRslt时,我开始出现此错误。
我的应用程序一直崩溃,它说:
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 :(得分:0)
为Activity
添加空构造函数
如下所示
public SoundClsRslt(){}
正如您所提到的参数化构造函数
强烈建议不要使用Activity/Fragment
的<{1}}传递数据的参数化构造
<击> 撞击>
<击>Intent
击> <击> 撞击>