title: Delphi xe5 Android app freezes when accessing Clipboard
body: <p>I am building an application for Android using Delphi XE5 that makes use of the Zxing barcode application and it uses the clipboard to retrieve the result. All of the code (Most of it anyway) is from a tutorial that I have found on the web. When I followed the tutorial, it worked to a charm but when applying the SAME code within an application that I was already working on - it did not work. Whenever accessing the clipboard ( in the 'OnTimer' event), the application always hangs and stops working. No error, nothing. App freezes and I have to close it via the phone's task manager. </p>
  
  <p>The application fails right after the following line</p>
  
  <pre><code>Log.Add('AndroidClipboardScanner:1'); Log.SaveToFile(INIFileLog);
  </code></pre>
  
  <p>I have changed the coding around so that the app assumed the Clipboard service was available in the Ontimer event and it proceeded but it then failed after the following line:</p>
  
  <pre><code>Log.Add('AndroidClipboardScanner:4'); Log.SaveToFile(INIFileLog);
  </code></pre>
  
  <p>I am not sure where to begin debugging because the same code works in the other application that I created following the initial guide I found. I can also confirm that the ClipService is being assigned properly, otherwise the intent wouldn't even begin. Any help or guidance would be much appreciated ! Below is my code...</p>
  
  <p>This Declared in the 'Private' variables section of the form:</p>
  
  <pre><code>ClipService: IFMXClipboardService;
  </code></pre>
  
  <p>This within the 'OnTimer' event for Timer1:</p>
  
  <pre><code>procedure TMain_Form.Timer1Timer(Sender: TObject);
  var
    barCode : String;
  begin
  timer1.Enabled := false;
  Log.Add('AndroidClipboardScanner:0.1'); Log.SaveToFile(INIFileLog);
    Try
      if assigned(ClipService) then begin
      Log.Add('AndroidClipboardScanner:1'); Log.SaveToFile(INIFileLog);
         if (ClipService.GetClipboard.ToString &lt;&gt; 'nil') then
          begin
            Log.Add('AndroidClipboardScanner:2'); Log.SaveToFile(INIFileLog);
            timer1.Enabled := false;
            Log.Add('AndroidClipboardScanner:3'); Log.SaveToFile(INIFileLog);
            Elapsed := 0;
            Log.Add('AndroidClipboardScanner:4'); Log.SaveToFile(INIFileLog);
            editHold.PasteFromClipboard;
            //EditHold.Text := ClipService.GetClipboard.ToString;
            Log.Add('AndroidClipboardScanner:5'); Log.SaveToFile(INIFileLog);
          end else
          begin
            Log.Add('AndroidClipboardScanner:6'); Log.SaveToFile(INIFileLog);
            Timer1.Enabled := False;
            Log.Add('AndroidClipboardScanner:7'); Log.SaveToFile(INIFileLog);
          end;
          Log.Add('AndroidClipboardScanner:8'); Log.SaveToFile(INIFileLog);
      end else begin
        ShowMessage('Unexpected error has occured');
      end;
    Except
      ShowMessage('Unexpected error has occured..');
    End;
  end;
  </code></pre>
  
  <p>Within the ONCreate procedure of the form:</p>
  
  <pre><code>  if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService,
    IInterface(ClipService)) then begin
      ShowMessage('Clipboard Failed:1');
      ClipService := nil;
    end;
    Elapsed := 0;
  </code></pre>
  
  <p>This is for click event for the button that begins the intent:</p>
  
  <pre><code>procedure TMain_Form.Button_ShowScannerClick(Sender: TObject);
  {$IFDEF ANDROID}
  var
    intent: JIntent; {$ENDIF}
  begin
  {$IFDEF ANDROID}
    //ShowMessage('Scanner:1');
    if assigned(ClipService) then begin
            //ShowMessage('Scanner:2');
            ClipService.SetClipboard('nil');
            intent := tjintent.Create;
            intent.setAction(stringtojstring('com.google.zxing.client.android.SCAN'));
            intent.putExtra(tjintent.JavaClass.EXTRA_INTENT,
              stringtojstring('"SCAN_MODE"'));
            sharedactivity.startActivityForResult(intent,0);
            Elapsed := 0;
            timer1.Enabled := true;
            //ShowMessage('Scanner:3');
        end;
  {$ENDIF}
  </code></pre>