2015-10-16 14 views
3

我最初的問題是能夠點擊在文本字段上進行點擊時彈出的「粘貼」氣泡。目前我還沒有找到一種方法來使用uiautomator腳本/代碼來執行該操作。所以我開始考慮直接訪問剪貼板。現在我遇到了訪問android設備上剪貼板的問題。我們沒有使用應用程序(apk),而是將jar推送到設備,然後使用adb runtest來運行這些類。所以沒有任何活動正在開始。我猜這是我所有的問題都來自於。我創建了一個我稱之爲試圖訪問剪貼板的類文件。但是,我目前正在收到此錯誤消息「java.lang.IllegalStateException:系統服務不可用於onCreate()之前的活動」。我是android和uiautomator的新手。在哪裏/如何將onCreate()添加到此代碼中。我知道我們使用的過程最好是奇怪的。值得讚賞的是,使用uiautomator點擊「PASTE」泡泡或獲得課程的幫助。 我在幾個區域嘗試了onCreate(),正如你所看到的,但目前爲止還沒有運氣。如何訪問Android設備上的剪貼板

這裏是我的班至今:

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()); 
    } 
} 

}

+0

也許它會工作,如果你調用getApplicationContext()。getSystemService(),而不是? – geokavel

+0

這讓我有同樣的錯誤。 – user2998147

回答

1

Android系統只允許我們激活一次一個Activity,和其他人都在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組件類有Context,例如ActivityServiceBroadcastReceiver

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

添加了一個帖子來顯示調用類。 – user2998147

+0

修改我的類以匹配您的上面,但我得到的錯誤「GetClipBoard()在GetClipBoard不能應用到com.testingAp.test.SetUpApp」從調用類SetUpApp(this)被加下劃線爲紅色,當被挖空時給出那個錯誤。 – user2998147

+0

@ user2998147,這是根據你調用'this'的地方。如果它放在一個片段中,使用'getActivity()'。然後,不要用'Activity'擴展'GetClipBoard'並刪除任何'onCreate()'方法,請用'AsyncTask'擴展它。 –

0

我相信這是我的問題,目前我不認爲我有一個具有上下文的組件。這是我從(它的一部分)和第一個被adb runtest調用的類調用的類。

public class SetupApp extends UiAutomatorTestCase { 


    public void testAppSetup() throws UiObjectNotFoundException, RemoteException 
    { 

     //other code here 

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