将 JInputStream 转换为 Base64
Convert JInputStream to Base64
我使用 MemoryStream
作为中介将 JInputStream
转换为 base64。我需要这样做,因为 JInputStream
不会扩展基础 class TStream
.
我故意通过删除 try/finally 块来简化代码。
JStream := TAndroidHelper.ContentResolver.openInputStream(StrToJURI(FSelector.Files[I]));
Buffer := TJavaArray<Byte>.Create(JStream.Available);
JStream.Read(Buffer);
MStream := TMemoryStream.Create;
MStream.Write(Buffer.Data^, Buffer.Length);
MStream.position := 0;
SStream := TStringStream.Create('', TEncoding.ASCII);
Soap.EncdDecd.EncodeStream(MStream, SStream);
Base64Stream := SStream.DataString;
Base64Stream := Base64Stream.Replace(#10, '');
Base64Stream := Base64Stream.Replace(#13, '');
有没有直接把我的JInputSream
的数据转成base64的方法?
为 Android Base64 class 导入:
uses
Androidapi.JNIBridge, Androidapi.JNI.JavaTypes;
type
JBase64Class = interface(JObjectClass)
['{DA78E162-4CB0-455B-ACC0-BEDDE5484C85}']
function _GetCRLF: Integer; cdecl;
function _GetDEFAULT: Integer; cdecl;
function _GetNO_CLOSE: Integer; cdecl;
function _GetNO_PADDING: Integer; cdecl;
function _GetNO_WRAP: Integer; cdecl;
function _GetURL_SAFE: Integer; cdecl;
function decode(input: TJavaArray<Byte>; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function decode(input: TJavaArray<Byte>; offset: Integer; len: Integer; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function decode(str: JString; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function encode(input: TJavaArray<Byte>; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function encode(input: TJavaArray<Byte>; offset: Integer; len: Integer; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function encodeToString(input: TJavaArray<Byte>; flags: Integer): JString; cdecl; overload;
function encodeToString(input: TJavaArray<Byte>; offset: Integer; len: Integer; flags: Integer): JString; cdecl; overload;
property &DEFAULT: Integer read _GetDEFAULT;
property CRLF: Integer read _GetCRLF;
property NO_CLOSE: Integer read _GetNO_CLOSE;
property NO_PADDING: Integer read _GetNO_PADDING;
property NO_WRAP: Integer read _GetNO_WRAP;
property URL_SAFE: Integer read _GetURL_SAFE;
end;
[JavaSignature('android/util/Base64')]
JBase64 = interface(JObject)
['{AC976256-7237-4F07-87CD-B57F5F28BF6A}']
end;
TJBase64 = class(TJavaGenericImport<JBase64Class, JBase64>)
end;
将基于文件的 URI 编码为 Base64 的函数:
uses
System.SysUtils,
Androidapi.Helpers, Androidapi.JNI.Net, Androidapi.JNI.JavaTypes;
function JURIToBase64(const AJURI: Jnet_Uri): string;
var
LInput: JInputStream;
LJavaBytes: TJavaArray<Byte>;
LBytes: TBytes;
begin
LInput := TAndroidHelper.Context.getContentResolver.openInputStream(AJURI);
LJavaBytes := TJavaArray<Byte>.Create(LInput.available);
try
LInput.read(LJavaBytes, 0, LJavaBytes.Length);
Result := JStringToString(TJBase64.JavaClass.encodeToString(LJavaBytes, TJBase64.JavaClass.NO_WRAP));
finally
LJavaBytes.Free;
end;
end;
根据您的要求使用示例:
Base64Result := JURIToBase64(StrToJURI(FSelector.Files[I]));
我使用 MemoryStream
作为中介将 JInputStream
转换为 base64。我需要这样做,因为 JInputStream
不会扩展基础 class TStream
.
我故意通过删除 try/finally 块来简化代码。
JStream := TAndroidHelper.ContentResolver.openInputStream(StrToJURI(FSelector.Files[I]));
Buffer := TJavaArray<Byte>.Create(JStream.Available);
JStream.Read(Buffer);
MStream := TMemoryStream.Create;
MStream.Write(Buffer.Data^, Buffer.Length);
MStream.position := 0;
SStream := TStringStream.Create('', TEncoding.ASCII);
Soap.EncdDecd.EncodeStream(MStream, SStream);
Base64Stream := SStream.DataString;
Base64Stream := Base64Stream.Replace(#10, '');
Base64Stream := Base64Stream.Replace(#13, '');
有没有直接把我的JInputSream
的数据转成base64的方法?
为 Android Base64 class 导入:
uses
Androidapi.JNIBridge, Androidapi.JNI.JavaTypes;
type
JBase64Class = interface(JObjectClass)
['{DA78E162-4CB0-455B-ACC0-BEDDE5484C85}']
function _GetCRLF: Integer; cdecl;
function _GetDEFAULT: Integer; cdecl;
function _GetNO_CLOSE: Integer; cdecl;
function _GetNO_PADDING: Integer; cdecl;
function _GetNO_WRAP: Integer; cdecl;
function _GetURL_SAFE: Integer; cdecl;
function decode(input: TJavaArray<Byte>; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function decode(input: TJavaArray<Byte>; offset: Integer; len: Integer; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function decode(str: JString; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function encode(input: TJavaArray<Byte>; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function encode(input: TJavaArray<Byte>; offset: Integer; len: Integer; flags: Integer): TJavaArray<Byte>; cdecl; overload;
function encodeToString(input: TJavaArray<Byte>; flags: Integer): JString; cdecl; overload;
function encodeToString(input: TJavaArray<Byte>; offset: Integer; len: Integer; flags: Integer): JString; cdecl; overload;
property &DEFAULT: Integer read _GetDEFAULT;
property CRLF: Integer read _GetCRLF;
property NO_CLOSE: Integer read _GetNO_CLOSE;
property NO_PADDING: Integer read _GetNO_PADDING;
property NO_WRAP: Integer read _GetNO_WRAP;
property URL_SAFE: Integer read _GetURL_SAFE;
end;
[JavaSignature('android/util/Base64')]
JBase64 = interface(JObject)
['{AC976256-7237-4F07-87CD-B57F5F28BF6A}']
end;
TJBase64 = class(TJavaGenericImport<JBase64Class, JBase64>)
end;
将基于文件的 URI 编码为 Base64 的函数:
uses
System.SysUtils,
Androidapi.Helpers, Androidapi.JNI.Net, Androidapi.JNI.JavaTypes;
function JURIToBase64(const AJURI: Jnet_Uri): string;
var
LInput: JInputStream;
LJavaBytes: TJavaArray<Byte>;
LBytes: TBytes;
begin
LInput := TAndroidHelper.Context.getContentResolver.openInputStream(AJURI);
LJavaBytes := TJavaArray<Byte>.Create(LInput.available);
try
LInput.read(LJavaBytes, 0, LJavaBytes.Length);
Result := JStringToString(TJBase64.JavaClass.encodeToString(LJavaBytes, TJBase64.JavaClass.NO_WRAP));
finally
LJavaBytes.Free;
end;
end;
根据您的要求使用示例:
Base64Result := JURIToBase64(StrToJURI(FSelector.Files[I]));