0

I am trying to pass a String from ActMain to SoundClsRslt, but my SoundClsRslt does not extend Activity. I tried extend Activity but it will cause other problem i asked here: has no default constructor in android manifest .

everything works fine until the program reach the "startActivity(i);" , the app crashes and the logcat says "Unable to find explicit activity class {/com.Hugler.CB.SoundClsRslt}; have you declared this activity in your AndroidManifest.xml?". Do you know what's wrong?

Near the end of onCreate of ActMain for intent, and onSegment of SoundClsRslt for getintent.

My ActMain code:

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

My SoundClsRslt code:

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 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();
            }
        }
    }
}
Community
  • 1
  • 1
Eddie Lino
  • 9
  • 2
  • 4

2 Answers2

0

you can define a Context in your class's constructor. After chat you can get intent with myContext.getIntent() your constructor should be like this :

private Context myContext
public SoundClsRslt(ActMain pMain, Context context) {
    m_pMain = pMain;
    m_iID = 0;
    m_iID1 = 0;
    this.myContext = context;
    _fLog = null;
}
Mohammad Fatemi
  • 1,278
  • 2
  • 12
  • 16
  • everything works fine until the program reach the "startActivity(i);" , the app crashes and the logcat says "Unable to find explicit activity class {/com.Hugler.CB.SoundClsRslt}; have you declared this activity in your AndroidManifest.xml?". Do you know what's wrong? – Eddie Lino Jan 05 '16 at 10:59
0

You have already passed your ActMain instance to your SoundClsRslt. So put m_pMain.getIntent() instead of getIntent() in your SoundClsRslt and try.

Tharindu Welagedara
  • 2,660
  • 18
  • 27
  • everything works fine until the program reach the "startActivity(i);" , the app crashes and the logcat says "Unable to find explicit activity class {/com.Hugler.CB.SoundClsRslt}; have you declared this activity in your AndroidManifest.xml?". Do you know what's wrong? – Eddie Lino Jan 05 '16 at 10:59
  • You cant start SoundClsRslt as an activity. Because it's not an activity(According to your code here). – Tharindu Welagedara Jan 05 '16 at 11:08
  • If you want pass easyPuzzle string to SoundClsRslt. First just create a setter method in SoundClsRslt call it as this (ex: m_pSoundClsRslt.yourMethodName(easyPuzzle);) – Tharindu Welagedara Jan 05 '16 at 11:20
  • what do i do after creating a setter method? thanks for helping :) – Eddie Lino Jan 05 '16 at 12:30