Почему мой сервис не распознается?

Я создал службу для замены клавиатуры по умолчанию на мою настраиваемую клавиатуру ... код для моей настраиваемой клавиатуры работает (я тестировал в приложении). Я завернул код в сервис и развернул его на устройстве Android. Когда я пытаюсь включить настраиваемую клавиатуру с устройства, она просто дает сбой ... Я использовал log cat, чтобы захватить исключение. вот исключение:

Time Device Name Type PID Tag Message 06-03 00:03:38.287 Samsung SM-J327P Error 3044 AndroidRuntime java.lang.RuntimeException: Unable to instantiate service SimpleKeyboard.SimpleKeyboard.Activity1: java.lang.ClassNotFoundException: Didn't find class "SimpleKeyboard.SimpleKeyboard.Activity1" on path: DexPathList[[zip file "/data/app/SimpleKeyboard.SimpleKeyboard-1/base.apk"],nativeLibraryDirectories=[/data/app/SimpleKeyboard.SimpleKeyboard-1/lib/arm, /data/app/SimpleKeyboard.SimpleKeyboard-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]] at android.app.ActivityThread.handleCreateService(ActivityThread.java:3844) at android.app.ActivityThread.access$2100(ActivityThread.java:231) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1911) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7422) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

ниже размещен мой манифест:

<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "SimpleKeyboard.SimpleKeyboard" android:versionCode = "1" android:versionName = "1.0" android:installLocation = "auto">
    <uses-sdk android:minSdkVersion = "16" android:targetSdkVersion = "23" />
    <uses-permission android:name = "android.permission.READ_LOGS" />
    <uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
    <application>
        <service android:name = ".Activity1" android:label = "@string/app_name" android:permission = "android.permission.BIND_INPUT_METHOD" android:exported = "true">
            <intent-filter>
                <action android:name = "android.view.InputMethod" />
            </intent-filter>
            <meta-data android:name = "android.view.im" android:resource = "@xml/method" />
        </service>
    </application>
</manifest>

вот услуга:

public class Activity1 : InputMethodService
    {
        private KeyboardView kv;
        private Keyboard keyboard;
        private bool isCaps = false;

        public Activity1()
        {

        }
        public override void OnInitializeInterface()
        {
            if (IsExternalStorageWritable())
            {

                File appDirectory = new File(Android.OS.Environment.DirectoryDownloads + "/MyPersonalAppFolder");
                File logDirectory = new File(appDirectory + "/log");
                File logFile = new File(logDirectory, "logcat" + Guid.NewGuid() + ".txt");

                // create app folder
                if (!appDirectory.Exists())
                {
                    appDirectory.Mkdirs();
                }

                // create log folder
                if (!logDirectory.Exists())
                {
                    logDirectory.Mkdirs();
                }

                // clear the previous logcat and then write the new one to the file
                try
                {
                    Java.Lang.Process process = Runtime.GetRuntime().Exec("logcat -c");
                    process = Runtime.GetRuntime().Exec("logcat -f " + logFile);
                }
                catch (IOException e)
                {
                    e.PrintStackTrace();
                }

            }
            else if (isExternalStorageReadable())
            {
                // only readable
            }
            else
            {
                // not accessible
            }
            base.OnInitializeInterface();
        }
        public override void OnCreate()
        {
            if (IsExternalStorageWritable())
            {

                File appDirectory = new File(Android.OS.Environment.DirectoryDownloads + "/MyPersonalAppFolder");
                File logDirectory = new File(appDirectory + "/log");
                File logFile = new File(logDirectory, "logcat" + Guid.NewGuid() + ".txt");

                // create app folder
                if (!appDirectory.Exists())
                {
                    appDirectory.Mkdirs();
                }

                // create log folder
                if (!logDirectory.Exists())
                {
                    logDirectory.Mkdirs();
                }

                // clear the previous logcat and then write the new one to the file
                try
                {
                    Java.Lang.Process process = Runtime.GetRuntime().Exec("logcat -c");
                    process = Runtime.GetRuntime().Exec("logcat -f " + logFile);
                }
                catch (IOException e)
                {
                    e.PrintStackTrace();
                }

            }
            else if (isExternalStorageReadable())
            {
                // only readable
            }
            else
            {
                // not accessible
            }
            base.OnCreate();
        }
        public override View OnCreateInputView()
        {


            keyboard = new Keyboard(this, Resource.Xml.Qwerty);
            View kvl = (View)LayoutInflater.Inflate(Resource.Layout.Keyboard, null);
            kv = kvl.FindViewById<KeyboardView>(Resource.Id.keyboard);
            kv.Keyboard = keyboard;
            kv.OnKeyboardActionListener = new MyKeyboardListener(this); 
            return kv;
            // return null;
        }
        /* Checks if external storage is available for read and write */
        public bool IsExternalStorageWritable()
        {
            string state = Android.OS.Environment.ExternalStorageState;
            if (Android.OS.Environment.MediaMounted.Equals(state))
            {
                return true;
            }
            return false;
        }

        /* Checks if external storage is available to at least read */
        public bool isExternalStorageReadable()
        {
            string state = Android.OS.Environment.ExternalStorageState;
            if (Android.OS.Environment.MediaMounted.Equals(state) ||
                    Android.OS.Environment.MediaMountedReadOnly.Equals(state))
            {
                return true;
            }
            return false;
        }
    }

Что я делаю не так?

Вы решили свою проблему?

Eren Shen 05.06.2018 11:25

Нет, я не решил свою проблему ... Я пробовал то, что вы предложили ... У меня все еще та же проблема.

Daron 15.06.2018 23:08
1
2
111
2

Ответы 2

java.lang.ClassNotFoundException: Didn't find class

Обратитесь к @SushiHangover's отвечать:

Обходной путь:

Вы можете использовать очистить / восстановить в качестве обходного пути в Windows.

Я пробовал очистить / перестроить несколько раз ... все еще получаю ту же ошибку ... если это проблема в 8.1, поможет ли понижение версии проекта? Кроме того, вы сказали, что это проблема с Windows ... теоретически это должно работать на Mac?

Daron 05.06.2018 15:12

@ Дарон, это странно, это должно работать. Если возможно, не могли бы вы поделиться базовой демонстрацией, которая может воспроизвести проблему через онлайн-репо? Просто чтобы убедиться, что мы проверяем то же самое, что и вы.

Eren Shen 05.06.2018 15:40

вот ссылка на мой дропдокс, там проект заархивирован .. dropbox.com/s/x32wqikzkiftg4n/SimpleKeyboard.rar?dl=0

Daron 06.06.2018 03:23

Только что понял, что у меня 15.2 ... Я собираюсь установить 15.7.3 и посмотреть, осталась ли у меня эта проблема

Daron 09.06.2018 16:47

@Daron, когда вы устанавливаете VS 15.7.3, у вас будет проблема с AXML-дизайнер, но не беспокойтесь об этом, вы можете найти там обходной путь. И этот вопрос должен быть решен в VS 15.7.4.

Eren Shen 10.06.2018 09:10

Мне действительно показалась интересной эта строка: «/data/app/SimpleKeyboard.SimpleKeyboard-1/base.apk"] ... класс называется SimpleKeyboard.SimpleKeyboard ... откуда взялось" -1 "... (Я получил это из журналов, опубликованных выше) ... я даже не могу добавить тире 1, потому что тире являются специальными символами ... возможно, это как-то связано с тем, почему он не может найти имя службы.

Daron 15.06.2018 06:55

Все еще не на 100%, в чем была проблема, но я загружаю образец проекта из Xamarin и вижу несколько ключевых отличий ... добавлен и добавлен файл и две строки в этом манифесте, которые отсутствовали ... теперь он работает ... для всех эту проблему, ознакомьтесь с примером проектов службы xamarin, и вы также сможете исправить свою проблему.

Другие вопросы по теме