2014-10-22 84 views
1

我想限制我的應用程序與其他應用程序之間的複製,粘貼。這意味着來自我的應用程序的數據複製只能粘貼在我的應用程而第三個應用程序無法捕獲這個。Android限制複製,粘貼在應用程序之間查看

現在我有一個解決方案是每個EditText上,網頁視圖... eveything可以將數據複製創建包裝。並設置自定義ActionMode.Callback。但它無法控制所有情況(在運行時設置longClickListener,自定義上下文),因此存在風險。 (我改進,而不是代碼,所以在應用程序中有很多EditText)。

我需要一個很好的解決方案。請幫幫我。

如果可以請給我一個例子或程序代碼。

回答

0

你可以編碼你從視圖中進行選擇,並複製到剪貼板中的文本。 然後,如果您將該代碼粘貼到任何其他應用程序中,則只能看到編碼的字符串。 在您的應用程序,你需要粘貼到您的視圖之前對數據進行解碼

在這裏,我將提供代碼來支持我的發言:

public class MainActivity extends Activity { 
    EditText editText; 
    private ClipboardManager myClipboard; 
    private ClipData myClip; 
    String base64; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
     editText = (EditText) findViewById(R.id.editText3); 
     editText.setCustomSelectionActionModeCallback(new Callback() { 

      @Override 
      public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
       // TODO Auto-generated method stub 
       return false; 
      } 

      @Override 
      public void onDestroyActionMode(ActionMode mode) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
       // TODO Auto-generated method stub 
       return true; 
      } 

      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       // TODO Auto-generated method stub 
       switch (item.getItemId()) { 
       case android.R.id.copy: 
        int min = 0; 
        int max = editText.getText().length(); 
        if (editText.isFocused()) { 
         final int selStart = editText.getSelectionStart(); 
         final int selEnd = editText.getSelectionEnd(); 

         min = Math.max(0, Math.min(selStart, selEnd)); 
         max = Math.max(0, Math.max(selStart, selEnd)); 
        } 
        // Perform your definition lookup with the selected text 
        final CharSequence selectedText = editText.getText() 
          .subSequence(min, max); 
        String text = selectedText.toString(); 

        byte[] data = null; 
        try { 
         data = text.getBytes("UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        base64 = Base64.encodeToString(data, Base64.DEFAULT); 

        myClip = ClipData.newPlainText("text", base64); 
        myClipboard.setPrimaryClip(myClip); 
        Toast.makeText(getApplicationContext(), "Text Copied", 
          Toast.LENGTH_SHORT).show(); 
        // Finish and close the ActionMode 
        mode.finish(); 
        return true; 
       case android.R.id.cut: 
        return true; 
       case android.R.id.paste: 
        int min2 = 0; 
        int max2 = editText.getText().length(); 
        if (editText.isFocused()) { 
         final int selStart = editText.getSelectionStart(); 
         final int selEnd = editText.getSelectionEnd(); 

         min2 = Math.max(0, Math.min(selStart, selEnd)); 
         max2 = Math.max(0, Math.max(selStart, selEnd)); 
        } 
        // Perform your definition lookup with the selected text 
        final CharSequence selectedText2 = editText.getText() 
          .subSequence(min2, max2); 
        String text2 = selectedText2.toString(); 
        ClipData abc = myClipboard.getPrimaryClip(); 
        ClipData.Item item11 = abc.getItemAt(0); 
        String text1 = item11.getText().toString(); 
        byte[] dataDecode = Base64.decode(text1, Base64.DEFAULT); 
        String textDecode = null; 
        try { 
         textDecode = new String(dataDecode, "UTF-8"); 
        } catch (UnsupportedEncodingException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        editText.getText().replace(min2, max2, textDecode, 0, 
          textDecode.length()); 

        Toast.makeText(getApplicationContext(), "Text Pasted", 
          Toast.LENGTH_SHORT).show(); 
        // mode.finish(); 
        return true; 

       default: 
        break; 
       } 
       return false; 
      } 
     });     
    }  
} 

這裏我試圖重寫它出現在行動中複製和粘貼方法當用戶長時間點擊EditText欄時, 我的解決方案是隱藏其他應用程序中的數據的替代方法。

粘貼彈出當你在文本插入手柄和粘貼選項,然後單擊當您選擇一些文本和長點擊它說到這,都是從我的觀察不同出現。

爲了用漿糊彈出的工作,我創建了一個自定義的EditText類和I類定義做所需的任務的方法。這是...

/** 
* An EditText, which notifies when something was cut/copied/pasted inside it. 
*/ 
public class MonitoringEditText extends EditText { 

    private final Context context; 
    private ClipboardManager myClipboard; 
    String base64; 
    EditText editText = (EditText) findViewById(R.id.editText3); 

    /* 
    * Just the constructors to create a new EditText... 
    */ 
    public MonitoringEditText(Context context) { 
     super(context); 
     this.context = context; 
    } 

    public MonitoringEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context = context; 
    } 

    public MonitoringEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.context = context; 
    } 

    @Override 
    public boolean onTextContextMenuItem(int id) { 
     myClipboard = (ClipboardManager) context 
       .getSystemService(Context.CLIPBOARD_SERVICE); 
     boolean consumed = super.onTextContextMenuItem(id); 
     switch (id) { 
     // case android.R.id.cut: 
     // onTextCut(); 
     // break; 
     case android.R.id.paste: // here I am catching that pop up paste event 
      try { 
       onTextPaste(); 
      } catch (UnsupportedEncodingException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      break; 
     // case android.R.id.copy: 
     // onTextCopy(); 
     // 
     } 
     return consumed; 
    } 

    // /** 
    // * Text was pasted into the EditText. 
    // * @throws UnsupportedEncodingException 
    // */ 
    public void onTextPaste() throws UnsupportedEncodingException { 

     int min2 = 0; 
     int max2 = editText.getText().length(); 
     if (editText.isFocused()) { 
      final int selStart = editText.getSelectionStart(); 
      final int selEnd = editText.getSelectionEnd(); 

      min2 = Math.max(0, Math.min(selStart, selEnd)); 
      max2 = Math.max(0, Math.max(selStart, selEnd)); 
     } 
     ClipData abc = myClipboard.getPrimaryClip(); 
     ClipData.Item item = abc.getItemAt(0); 

     String text = item.getText().toString(); //text is my encoded data 
     byte[] data = Base64.decode(text, Base64.DEFAULT); 
     String text1 = new String(data, "UTF-8"); //text1 is decoded data 
     editText.getText().replace(min2, max2, text1); 
     String fullText = editText.getText().toString(); 
     editText.setText(fullText.replace(text, "")); 
    } 
} 
+0

感謝您的幫助。它是那麼好。 用戶如何通過彈出來複製? – Lights 2015-05-09 04:13:37

+0

請檢查更新的代碼@Lights – SKG 2015-05-11 07:56:49

+0

這是我找到的最好答案。非常感謝。 – Lights 2015-05-11 08:44:38

0

我真的不知道,但是這似乎是一個選項:

清除在剪貼板內容,而你的應用程序中去背景或結束。

//Inside onResume and onDestroy 
ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); 
clipboardManager.setText(""); 

希望它有幫助。

+0

感謝您的幫助。 但這樣容易把剪貼板上註冊一個事件監聽與addPrimaryClipChangedListener 所以第三APP可以立即捕捉到我的數據當我複製數據。 – Lights 2014-10-22 12:16:15