3

私の最初の問題は、クリックがテキストフィールドで保持されているときにポップアップする「PASTE」バブルをクリックできることです。現在、uiautomator スクリプト/コードを使用してそのアクションを実行する方法が見つかりません。そこで、クリップボードに直接アクセスすることを検討し始めました。現在、Android デバイスでクリップボードにアクセスする際に問題が発生しています。アプリ (apk) は使用していませんが、jar をデバイスにプッシュし、adb runtest を使用してクラスを実行しています。したがって、活動は開始されていません。それが私の問題のすべての原因であると推測しています。クリップボードにアクセスしようとして呼び出すクラス ファイルを作成しました。しかし、現在、「java.lang.IllegalStateException: System services not available to Activities before onCreate()」というエラー メッセージが表示されています。私はアンドロイドと uiautomator が初めてです。このコードに onCreate() を追加する場所/方法を教えてください。私たちが使用しているプロセスが奇妙であることはわかっています。uiautomator を使用して「PASTE」バブルをクリックするか、クラスを機能させるための助けをいただければ幸いです。ご覧のとおり、いくつかの領域で onCreate() を試しましたが、今のところうまくいきません。

これまでの私のクラスは次のとおりです。

import android.app.Activity;
import android.content.*;
import android.os.AsyncTask;


public class MyClipBoard extends Activity {
    public String clip;


    MyClipBoard() {
        super.onCreate(null);
    }

    public void getClipBoard(){
       new GetClipBoard().execute();
    }

   private class GetClipBoard extends AsyncTask<Void, Void, String> {
        private String pMyClip;
        @Override
        protected String doInBackground(Void...params) {
            try {
                onCreate(null);
                // ClipboardManager p = params[0];
                String pasteData = "";
                ClipboardManager myClipBoard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData.Item myClip = myClipBoard.getPrimaryClip().getItemAt(0);
                CreateDeviceInfoFile.createInfoFile("Data from  ClipBoard:", myClip.toString());
                CreateDeviceInfoFile.createInfoFile("Number of Items:", String.valueOf(myClipBoard.getPrimaryClip().getItemCount()));
                pMyClip = myClip.toString();
            }catch (Exception e){
                CreateDeviceInfoFile.createInfoFile("ERROR",e.toString());
            }


            // Gets the clipboard as text.
            return pMyClip;

        }

        @Override
        protected void onPostExecute(String result) {
           clip =  result;
            CreateDeviceInfoFile.createInfoFile("Data from PostExecute:",  result);
        }

    }
}

---------Edited added class-------------------
public class MiApp extends Application {
public MiClipBoard newBoard;
private static Context appContext;

MiApp(){
    this.onCreate();
    Looper.prepare();
    newBoard =  new MiClipBoard();
}

public MiClipBoard appClipBoard(){
    return newBoard;
}

@Override
public void onCreate(){
    super.onCreate();
 }

public static Context getContext(){
    return appContext.getApplicationContext();
}

}

public class MiClipBoard extends Activity {
private  ClipboardManager clipboard;

MiClipBoard(){
    Context context = MiApp.getContext();
    clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
}

public void writeToClipBoard(String clipText){

    try {
        ClipData clip = ClipData.newPlainText("simple text", "Hello, World!");
        clipboard.setPrimaryClip(clip);
        CreateDeviceInfoFile.createInfoFile("Writing to ClipBoard", "Hello World");
    } catch (Exception e){
        CreateDeviceInfoFile.createInfoFile("Write Error", e.toString());
    }
}


public void readClipBoard(){
    String pasteData = "";

    try {
        ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
        pasteData = item.getText().toString();
        CreateDeviceInfoFile.createInfoFile("From ClipBoard", pasteData);
    } catch (Exception e){
        CreateDeviceInfoFile.createInfoFile("Read Error", e.toString());
    }
}

}

4

2 に答える 2

1

Android システムActivityでは、一度に 1 つしかアクティブ化できず、その他はonPause()状態になっています。アクティビティの開始には がlayout.xml必要で、 を呼び出す必要がありますstartActivity(Intent)

logcat から:

「java.lang.IllegalStateException: システム サービスは、onCreate() の前にアクティビティで使用できません」。

getSystemService()の後にのみ利用可能であることがわかりますsuper.onCreate(Bundle)。これにより、アクティビティが作成されます。

getSystemService()非アクティビティ クラスで呼び出す良い方法は、ContextパラメーターをGetClipBoardのコンストラクターに渡し、次のようにすることpublicです。

public class GetClipBoard extends AsyncTask<Void, Void, String> {

    private Context context;

    public GetClipBoard(Context context){
    this.context = context;
    }

    private String pMyClip;
    @Override
    protected String doInBackground(Void...params) {
        try {
            // ClipboardManager p = params[0];
            String pasteData = "";
            ClipboardManager myClipBoard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
            ...
        }catch (Exception e){
        ...
        }
        // Gets the clipboard as text.
        return pMyClip;
    }
...
}

したがって、 を実行したら、、、などAsyncTaskを持つ Android コンポーネントからクラスを呼び出します。ContextActivityServiceBroadcastReceiver

new GetClipBoard(this).execute(); // 'this' > context
于 2015-10-16T02:51:30.257 に答える