2014-10-18 84 views
0

我得到使用JNI採用Delphi XE7從Android圖庫位圖工作。同樣的代碼,用Delphi XE6工作:在Image1.Bitmap.Assign(面),我得到一個破碎類錯誤充分利用通過JNI採用Delphi庫中的位圖,但沒有對德爾福XE7,德爾福XE6

unit home; 

interface 

uses 
    FMX.Platform.Android, Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, 
    FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.Provider, Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Messaging, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, 
    FMX.Objects, FMX.Surfaces, Data.DB, MemDS, DBAccess, MyAccess, Strutils, 
    FMX.Layouts, FMX.Memo; 

type 
    TForm1 = class(TForm) 
    ToolBar1: TToolBar; 
    SpeedButton1: TSpeedButton; 
    Label1: TLabel; 
    Image1: TImage; 
    procedure SpeedButton1Click(Sender: TObject); 
    private 
    { Private declarations } 
    const ScanRequestCode = 0; 
    var FMessageSubscriptionID: Integer; 
    procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); 
    function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 
{$R *.NmXhdpiPh.fmx ANDROID} 

procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
    Intent: JIntent; 
begin 
    FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, 
    HandleActivityMessage); 
    Intent := TJIntent.Create; 
    Intent.setAction(TJIntent.JavaClass.ACTION_GET_CONTENT); 
    Intent.setType(StringToJSTring('image/*')); 
    SharedActivity.startActivityForResult(Intent,0); 
end; 

procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); 
begin 
    if M is TMessageResultNotification then 
    OnActivityResult(TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode, 
     TMessageResultNotification(M).Value); 
end; 

function TForm1.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; 
var 
    uri: Jnet_Uri; 
    bitmap: JBitmap; 
    surface: TBitmapSurface; 
begin 

    TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID); 
    FMessageSubscriptionID := 0; 

    if Assigned(Data) then 
    begin 
    try 
     uri:=Data.getData; 
     bitmap := TJImages_Media.JavaClass.getBitmap(SharedActivity.getContentResolver, uri); 
     surface := TBitmapsurface.Create; 
     JBitMapToSurface(bitmap,surface); 
     // Fails here in Delphi XE7 
     //Image1.Bitmap.Assign(surface); 
    finally 
     surface.Free; 
     Result := true; 
    end; 

    end 
    else Result := false; 

end; 

end. 

代碼失敗。

Delphi XE7中發生了什麼變化導致了此錯誤?

+0

TBitmapsurface應在嘗試之前創建.. finally塊 – mjn 2014-10-18 12:14:25

+1

什麼是確切的錯誤消息文本? – mjn 2014-10-18 12:15:57

+0

最後和免費電話不需要與ARC – 2014-10-18 12:23:17

回答

0

嘗試:

TThread.Syncronize(零, 過程 開始 Image1.Bitmap.Assign(表面); 端 );

+0

謝謝,它的工作原理 – 2015-02-04 21:15:25

+0

它適用於像三星Galaxy S的平板電腦,並在手機上失敗,如三星S4。但是,如果應用程序使用Delphi XE6進行編譯,則適用於所有設備。用XE7或XE8編譯失敗。 – 2015-05-20 09:50:05