Я сделал приложение, которое вылетает, и я не вижу никакой причины для этого - PullRequest
0 голосов
/ 05 июля 2018

Недавно я создал приложение для Android Studio, в которое интегрировал API Dialogflow.
Мой код не содержит ошибок, но приложение зависает, когда я запускаю его на эмуляторе.

Я бегу:

  • Android Studio 3.1.3
  • Версия Gradle: 4.4
  • Версия Android-плагина: 3.1.3
  • Эмулятор: Nexus 5X API-26

Файл Gradle уровня моего проекта:

    // Top-level build file where you can add configuration options common to all sub-projects/modules.

    buildscript {

        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.1.3'


            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }

    allprojects {
        repositories {
            google()
            jcenter()
        }
    }

    task clean(type: Delete) {
        delete rootProject.buildDir
    }

**My App's Gradle File :**

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.therationalbloke.myzen"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    implementation 'ai.api:sdk:2.0.7@aar'
    implementation 'ai.api:libai:1.6.12'
    implementation 'com.google.code.gson:gson:2.8.0'
    implementation 'commons-io:commons-io:2.4'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Мой код MainActivity.java:

package com.testfile.dialogf;

import android.Manifest;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import ai.api.AIListener;
import ai.api.android.AIConfiguration;
import ai.api.android.AIService;
import ai.api.model.AIError;
import ai.api.model.AIResponse;
import ai.api.model.Result;

public class MainActivity extends AppCompatActivity implements AIListener {
    AIService aiService;
    TextView t;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        t = (TextView) findViewById(R.id.textView);
        int permission = ContextCompat.checkSelfPermission(this,
                Manifest.permission.RECORD_AUDIO);

        if (permission != PackageManager.PERMISSION_GRANTED) {

            makeRequest();
        }
        final AIConfiguration config = new AIConfiguration("CLIENT_ACCESS_TOKEN",
                AIConfiguration.SupportedLanguages.English,
                AIConfiguration.RecognitionEngine.System);
        AIService aiService = AIService.getService(this, config);
        aiService.setListener(this);
    }

    protected void makeRequest() {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECORD_AUDIO},
                101);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 101: {

                if (grantResults.length == 0
                        || grantResults[0] !=
                        PackageManager.PERMISSION_GRANTED) {


                } else {

                }
                return;
            }
        }
    }

    public void buttonClicked (View view){
        aiService.startListening();


    }

    @Override
    public void onResult(AIResponse result) {
        Log.d("ZenR", result.toString());
        Result result1 = result.getResult();
        t.setText("Query "+result1.getResolvedQuery()+" action: "+result1.getAction());




    }


    @Override
    public void onError(AIError error) {

    }

    @Override
    public void onAudioLevel(float level) {

    }

    @Override
    public void onListeningStarted() {

    }

    @Override
    public void onListeningCanceled() {

    }

    @Override
    public void onListeningFinished() {

    }
}

Теперь, когда я запускаю этот код на моем эмуляторе. Приложение вылетает. Там нет ошибок в синтаксисе вообще. Я не совсем уверен, о чем это.

Вот ошибка на моем эмуляторе, когда приложение вылетает

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы уже объявили aiService во всем мире:

AIService aiService;

Не нужно объявлять внутри onCreate() снова. Заменить следующую строку :

AIService aiService = AIService.getService(this, config);

С:

aiService = AIService.getService(this, config);
0 голосов
/ 05 июля 2018

Причиной сбоя приложения могут быть ошибки времени компиляции или ошибки времени выполнения.

Ошибки времени компиляции могут быть синтаксическими ошибками, ошибками не найденного класса, ошибками перегрузки, которые отображаются и записываются в Android Studio. В вашем случае не будет ошибок времени компиляции, поскольку ваше приложение правильно компилируется и устанавливается на устройство.

Run-Time ошибки возникают при использовании (запуске) приложения. В основном это логические ошибки или ошибки объявления переменных. В твоем случае может быть проблема только здесь.

Когда вы запускаете приложение, выполняются коды и логика. Таким образом, если вы указали неверную логику в своем коде, например, бесконечный цикл, передачу строки вместо целочисленного типа данных и многое другое, приложение перестало работать.

Вы должны проверить журнал, чтобы увидеть, что является исключением, вызвавшим сбой. В журнале (нижняя часть среды IDE) будет указано имя исключения, элемент, который его запустил, а также ссылки на строки кода, где обнаружена проблема.

Если вы все еще не можете найти ошибку таким образом, вы можете установить точки останова слева от строк кода, где вы хотите, чтобы приложение останавливалось во время отладки, а затем запустить приложение в режиме отладки, чтобы точно увидеть, что происходит .

Еще один совет: часто, когда я был уверен в правильности своего кода, и он запускается, но вылетает, он касается объявления всех действий в манифесте (или всех служб) и установки всех необходимых разрешений. Потому что в этом случае нет явных ошибок перед запуском приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...