2017-12-22 11 views
-2

私はインテントを使ってみましたが、アプリはクラッシュし続けていたので、ファイルを使うことを考えました。アプリが再びクラッシュしました。アプリケーションは、音声をテキストに変換し、それをMQTTサーバーに送信します。私はスピーチをテキスト関数にテストし、正常に動作します。インテントまたはファイルのコードを追加した後、クラッシュします。 アクティビティーからMQTTヘルパー・クラス(どのメソッド)にデータを渡すか?

これは(これは、これはこれはbuild.gradleのAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.aisha"> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service android:name="org.eclipse.paho.android.service.MqttService" /> 
    <service android:enabled="true" android:name="helpers.MQTTHelper" /> 
</application> 

</manifest> 

MQTThelper.class

import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.os.IBinder; 
import android.support.annotation.Nullable; 
import android.util.Log; 
import android.widget.Toast; 

import org.eclipse.paho.android.service.MqttAndroidClient; 
import org.eclipse.paho.client.mqttv3.DisconnectedBufferOptions; 
import org.eclipse.paho.client.mqttv3.IMqttActionListener; 
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; 
import org.eclipse.paho.client.mqttv3.IMqttToken; 
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended; 
import org.eclipse.paho.client.mqttv3.MqttConnectOptions; 
import org.eclipse.paho.client.mqttv3.MqttException; 
import org.eclipse.paho.client.mqttv3.MqttMessage; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class MQTTHelper extends Service{ 
public MqttAndroidClient mqttAndroidClient; 
public static String userID; 
Context context; 
String readData; 
final String serverUri = "tcp://m12.cloudmqtt.com:10133"; 

final String clientId = "ExampleAndroidClient"; 
final String subscriptionTopic = "sensor/+"; 

final String username = "tiswwmgq"; 
final String password = "gSDAucu0fU_E"; 
public MQTTHelper(){} //removes error in manifest file. Seems optional 
public MQTTHelper(Context context){ 
    mqttAndroidClient = new MqttAndroidClient(context, serverUri, clientId); 
    mqttAndroidClient.setCallback(new MqttCallbackExtended() { 
     @Override 
     public void connectComplete(boolean b, String s) { 
      Log.w("mqtt", s); 
     } 

     @Override 
     public void connectionLost(Throwable throwable) { 

     } 

     @Override 
     public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { 
      Log.w("Mqtt", mqttMessage.toString()); 
     } 

     @Override 
     public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { 
     } 
    }); 
    connect(); 
} 

public void setCallback(MqttCallbackExtended callback) { 
    mqttAndroidClient.setCallback(callback); 
} 

private void connect(){ 
    MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); 
    mqttConnectOptions.setAutomaticReconnect(true); 
    mqttConnectOptions.setCleanSession(false); 
    mqttConnectOptions.setUserName(username); 
    mqttConnectOptions.setPassword(password.toCharArray()); 

    try { 

     mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() { 
      @Override 
      public void onSuccess(IMqttToken asyncActionToken) { 

       DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions(); 
       disconnectedBufferOptions.setBufferEnabled(true); 
       disconnectedBufferOptions.setBufferSize(100); 
       disconnectedBufferOptions.setPersistBuffer(false); 
       disconnectedBufferOptions.setDeleteOldestMessages(false); 
       mqttAndroidClient.setBufferOpts(disconnectedBufferOptions); 
       subscribeToTopic(); 
       publishtopic(); 
      } 

      @Override 
      public void onFailure(IMqttToken asyncActionToken, Throwable exception) { 
       Log.w("Mqtt", "Failed to connect to: " + serverUri + exception.toString()); 
      } 
     }); 


    } catch (MqttException ex){ 
     ex.printStackTrace(); 
    } 
} 
public void readFromSD() 
{ 
    File root=android.os.Environment.getExternalStorageDirectory(); 
    File dir=new File(root.getAbsolutePath() + "/VoiceReader"); 
    File myfile = new File(dir,"Output.txt"); 

    FileInputStream fis= null; 
    try { 
     fis = getApplicationContext().openFileInput("Output.txt"); 
     InputStreamReader isr =new InputStreamReader(fis); 
     BufferedReader br=new BufferedReader(isr); 
     try { 
      readData=br.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 


} 

private void subscribeToTopic() { 

    try { 
     mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() { 
      @Override 
      public void onSuccess(IMqttToken asyncActionToken) { 
       Log.w("Mqtt","Subscribed!"); 
      } 

      @Override 
      public void onFailure(IMqttToken asyncActionToken, Throwable exception) { 
       Log.w("Mqtt", "Subscribed fail!"); 
      } 
     }); 

    } catch (MqttException ex) { 
     System.err.println("Exceptions at subscribing"); 
     ex.printStackTrace(); 
    } 
} 
public int onStartCommand(Intent intent, int flags, int startId) { 
    //super.onStartCommand(intent,flags,startId); //I added dis 
    //String userID = intent.getStringExtra("name"); 
    readFromSD(); 
    //Toast.makeText(getApplicationContext(),userID, Toast.LENGTH_LONG).show(); 
    Toast.makeText(this,readData, Toast.LENGTH_LONG).show(); 
    return START_STICKY; 

} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

private void publishtopic() 
{ 



    try { 
     mqttAndroidClient.publish("sensor/t",new MqttMessage(readData.getBytes())); 
    } catch (MqttException e) { 
     e.printStackTrace(); 
    } 
} 


} 

であるMainActivity.class

import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.speech.RecognizerIntent; 
import android.speech.tts.TextToSpeech; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; 
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended; 
import org.eclipse.paho.client.mqttv3.MqttMessage; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.ArrayList; 

import helpers.MQTTHelper; 

public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener { 
MQTTHelper mqttHelper; 
TextView dataReceived; 
TextToSpeech tts; 
public static String s; 
Button startRecognizer; 
private static final int RQS_RECOGNITION = 1; 

@Override 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    dataReceived = (TextView) findViewById(R.id.dataReceived); 


    startRecognizer = (Button) findViewById(R.id.startrecognizer); 
    startRecognizer.setEnabled(false); 
    startRecognizer.setOnClickListener(startRecognizerOnClickListener); 
    tts = new TextToSpeech(this, this); 
    Intent serviceIntent = new Intent(MQTTHelper.class.getName()); 
    serviceIntent.putExtra("name", "hello"); 
    this.startService(serviceIntent); 
    startMqtt(); 
} 
private Button.OnClickListener startRecognizerOnClickListener = new Button.OnClickListener() { 

    @Override 
    public void onClick(View arg0) { 
     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
       RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech to Recognize"); 
     startActivityForResult(intent, RQS_RECOGNITION); 
    } 
}; 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if ((requestCode == RQS_RECOGNITION) & (resultCode == RESULT_OK)) { 
     ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 
     //ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, result); 
     Toast.makeText(getApplicationContext(),result.get(0),Toast.LENGTH_LONG).show(); 
     writeToSD(result.get(0)); 
     s=result.get(0); 
     //Intent intent = new Intent(MainActivity.this, MQTTHelper.class); 
     //Intent intent = new Intent(MQTTHelper.class.getName()); 
     //intent.putExtra("name", s); 
     //bindService(intent, (ServiceConnection) this, Context.BIND_AUTO_CREATE); 
     //startService(intent); 
    } 

} 
private void writeToSD(String sttdata) 
{ 
    File root=android.os.Environment.getExternalStorageDirectory(); 
    File dir=new File(root.getAbsolutePath() + "/VoiceReader"); 
    if(!dir.exists() && !dir.isDirectory()) 
    {dir.mkdir();} 
    File file=new File(dir,"Output.txt"); 
    try 
    { 
     FileOutputStream f=new FileOutputStream(file); 
     PrintWriter pw=new PrintWriter(f); 
     pw.println(sttdata); 
     pw.flush(); 
     pw.close(); 
     f.close(); 
    }catch (FileNotFoundException e){ 
     e.printStackTrace(); 
    }catch (IOException i){ 
     i.printStackTrace(); 
    } 
    try { 
     Intent in=new Intent(Intent.ACTION_EDIT); 
     Uri uri= Uri.fromFile(file); 
     in.setDataAndType(uri,"plain/text"); 
     startActivity(in); 
    }catch(Exception ex){ 
     Log.e("tag","No file browser installed. "+ex.getMessage()); 
    } 

} 

@Override 
public void onInit(int arg0) { 
    startRecognizer.setEnabled(true); 
} 
private void startMqtt() { 
    mqttHelper = new MQTTHelper(getApplicationContext()); 
    mqttHelper.setCallback(new MqttCallbackExtended() { 
     @Override 
     public void connectComplete(boolean b, String s) { 

     } 

     @Override 
     public void connectionLost(Throwable throwable) { 

     } 

     @Override 
     public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { 
      Log.w("Debug", mqttMessage.toString()); 
      dataReceived.setText(mqttMessage.toString()); 
     } 
     //something 
     @Override 
     public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { 

     } 
    }); 
} 

} 

ありますモジュール:app)

apply plugin: 'com.android.application' 

android { 
compileSdkVersion 25 
buildToolsVersion "25.0.2" 
defaultConfig { 
    applicationId "com.example.aisha" 
    minSdkVersion 15 
    targetSdkVersion 25 
    versionCode 1 
    versionName "1.0" 
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
} 
buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 
} 

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
    exclude group: 'com.android.support', module: 'support-annotations' 
}) 
compile 'com.android.support:appcompat-v7:25.3.1' 
compile 'com.android.support.constraint:constraint-layout:1.0.2' 
testCompile 'junit:junit:4.12' 

    compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' 
    compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' 
} 

これはインテントまたはファイルを使用して取得したエラーです。

12-22 11:25:13.201 32311-32311/com.example.aisha E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.aisha, PID: 32311 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.aisha/com.example.aisha.MainActivity}: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=helpers.MQTTHelper (has extras) } 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=helpers.MQTTHelper (has extras) } 
    at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1345) 
    at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1374) 
    at android.app.ContextImpl.startService(ContextImpl.java:1358) 
    at android.content.ContextWrapper.startService(ContextWrapper.java:613) 
    at com.example.aisha.MainActivity.onCreate(MainActivity.java:51) 
    at android.app.Activity.performCreate(Activity.java:6720) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)  
    at android.app.ActivityThread.-wrap12(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:154)  
    at android.app.ActivityThread.main(ActivityThread.java:6119)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  
+1

ポストのみ関連するコード活動からのパスデータ[の –

+3

可能な複製にで

Intent serviceIntent = new Intent(MainActivity.this, MQTTHelper.class); 

代わりの

Intent serviceIntent = new Intent(MQTTHelper.class.getName()); 

詳細インテントを使用したサービス](https://stackoverflow.com/questions/329324 3/pass-data-from-activity-to-intent) –

+0

@ニル私はその方法を試みました。それは動作しませんでしたし、アプリケーションがクラッシュします。私は私の場合に方法を探していました。 – user9129821

答えて

関連する問題