如何访问安卓设备的剪贴板

3
我的初始问题是,当在文本字段上按住点击时弹出“粘贴”气泡的单击操作。目前我还没有找到使用uiautomator脚本/代码来实现该操作的方法。因此,我开始考虑直接访问剪贴板。现在我遇到了在Android设备上访问剪贴板的问题。我们没有使用应用程序(APK),而是将JAR推送到设备上,然后使用adb runtest运行类。因此,没有启动任何活动。我猜这就是所有问题的根源。我创建了一个类文件,尝试访问剪贴板。但是,我目前得到了这个错误消息:“java.lang.IllegalStateException: System services not available to Activities before onCreate()”。我是Android和uiautomator的新手。我应该在哪里/如何添加onCreate()到这段代码中。我知道我们正在使用的过程最多也就是奇怪。任何帮助,无论是使用uiautomator点击“粘贴”气泡,还是让类正常工作,都将不胜感激。
目前我的类如下:
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());
    }
}

}


也许如果你调用getApplicationContext().getSystemService()会起作用? - geokavel
这会让我得到相同的错误。 - user2998147
2个回答

1

Android系统一次只能激活一个Activity,其他的则处于onPause()状态。启动一个活动应该有一个layout.xml,并且必须调用startActivity(Intent)

从logcat中可以看到:

"java.lang.IllegalStateException: 在 onCreate() 之前,活动无法使用系统服务。"

我们可以知道,在触发活动被创建的super.onCreate(Bundle)之后,getSystemService()才可用。

在非活动类中调用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,请从具有Context的Android组件中调用该类,例如ActivityServiceBroadcastReceiver等。

new GetClipBoard(this).execute(); // 'this' > context

修改了我的类以匹配你上面的类,但是我得到了一个错误:“GetClipBoard() in GetClipBoard can not be applied to com.testingAp.test.SetUpApp”,来自调用类 SetUpApp(this)被用红线标出,并且当鼠标悬停时会给出该错误。 - user2998147
@user2998147,这取决于您在哪里调用this。如果它放置在片段中,请使用getActivity()。然后,请不要将GetClipBoardActivity一起扩展,并删除任何onCreate()方法,请改为使用AsyncTask进行扩展。 - Anggrayudi H
感谢您的帮助。我已经重新开始,尝试从不同的方向来解决这个问题。请参见编辑部分。没有编译错误,但每当我调用getApplicationContext()时都会出现空指针异常。所以我不确定如何获取上下文。 - user2998147

0

我相信这就是我的问题,目前我认为我没有一个具有上下文的组件。这是我正在调用的类(其中的一部分),也是被adb runtest调用的第一个类。

  public class SetupApp  extends UiAutomatorTestCase {


    public void testAppSetup() throws UiObjectNotFoundException, RemoteException
    { 

         //other code here

         MyClipBoard myBoard = new MyClipBoard();
         myBoard.getClipBoard(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接