提交 f989abc5 编写于 作者: 若苗瞬's avatar 若苗瞬 😶

upd: for rad11, but still can't open txt file.

上级 43d02079
...@@ -5,11 +5,14 @@ ...@@ -5,11 +5,14 @@
android:versionCode="%versionCode%" android:versionCode="%versionCode%"
android:versionName="%versionName%" android:versionName="%versionName%"
android:installLocation="%installLocation%"> android:installLocation="%installLocation%">
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" /> <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
<%uses-permission%> <%uses-permission%>
<uses-feature android:glEsVersion="0x00020000" android:required="True"/> <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<application android:persistent="%persistent%" <queries>
<%queries-child-elements%>
</queries>
<application
android:persistent="%persistent%"
android:restoreAnyVersion="%restoreAnyVersion%" android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%" android:label="%label%"
android:debuggable="%debuggable%" android:debuggable="%debuggable%"
...@@ -19,27 +22,28 @@ ...@@ -19,27 +22,28 @@
android:hardwareAccelerated="%hardwareAccelerated%" android:hardwareAccelerated="%hardwareAccelerated%"
android:resizeableActivity="false" android:resizeableActivity="false"
android:requestLegacyExternalStorage="true"> android:requestLegacyExternalStorage="true">
<%provider%>
<%provider%> <%application-meta-data%>
<%application-meta-data%> <%uses-libraries%>
<%uses-libraries%> <%services%>
<%services%>
<!-- Our activity is a subclass of the built-in NativeActivity framework class. <!-- Our activity is a subclass of the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. --> This will take care of integrating with our NDK code. -->
<activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" <activity
android:name="com.embarcadero.firemonkey.FMXNativeActivity"
android:label="%activityLabel%" android:label="%activityLabel%"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:launchMode="singleTask"> android:launchMode="singleTask">
<!-- Tell NativeActivity the name of our .so --> <!-- Tell NativeActivity the name of our .so -->
<meta-data android:name="android.app.lib_name" <meta-data android:name="android.app.lib_name" android:value="%libNameValue%" />
android:value="%libNameValue%" />
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<%activity%> <%activity%>
<%receivers%> <%receivers%>
</application> </application>
</manifest> </manifest>
<!-- END_INCLUDE(manifest) --> <!-- END_INCLUDE(manifest) -->
# AC Lottery # AC Lottery
#### 介绍 ## 介绍
奥诚科技年会抽奖程序(功能非常简单)。 奥诚科技年会抽奖程序(功能非常简单)。
#### 软件架构 ## 软件架构
Windows & Android Windows & Android
#### 安装教程 ## 安装教程
1. Windows下直接运行exe程序。 1. Windows下直接运行exe程序。
2. 安卓下安装APK并运行。 2. 安卓下安装APK并运行。
#### 使用说明 ## 使用说明
1. 打开程序。 1. 打开程序。
2. 按钮1)选择抽奖名单(安卓下预设在/storage/emulated/0/抽奖名单.txt) 2. 按钮1)选择抽奖名单(安卓下预设在/storage/emulated/0/抽奖名单.txt)
3. 按钮2)选择背景音乐(安卓下固定在/storage/emulated/0/背景音乐.mp3) 3. 按钮2)选择背景音乐(安卓下固定在/storage/emulated/0/背景音乐.mp3)
...@@ -19,14 +19,14 @@ Windows & Android ...@@ -19,14 +19,14 @@ Windows & Android
5. 抽中的人不会参与下一次抽奖,但在预览界面仍会被随机显示和选中。 5. 抽中的人不会参与下一次抽奖,但在预览界面仍会被随机显示和选中。
6. 无奖项设置等其它功能,适合小型抽奖。 6. 无奖项设置等其它功能,适合小型抽奖。
#### 参与贡献 ## 参与贡献
1. Fork 本仓库 1. Fork 本仓库
2. 新建 Feat_xxx 分支 2. 新建 Feat_xxx 分支
3. 提交代码 3. 提交代码
4. 新建 Pull Request 4. 新建 Pull Request
#### MISC ## MISC
2. 博客 [DDRFAN](https://blog.csdn.net/ddrfan) 2. 博客 [DDRFAN](https://blog.csdn.net/ddrfan)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
......
...@@ -2,7 +2,7 @@ object Form5: TForm5 ...@@ -2,7 +2,7 @@ object Form5: TForm5
Left = 0 Left = 0
Top = 0 Top = 0
Caption = #22885#35802#31185#25216#26032#26149#22823#25277#22870 Caption = #22885#35802#31185#25216#26032#26149#22823#25277#22870
ClientHeight = 591 ClientHeight = 592
ClientWidth = 1000 ClientWidth = 1000
Position = ScreenCenter Position = ScreenCenter
Quality = HighPerformance Quality = HighPerformance
...@@ -41697,7 +41697,7 @@ object Form5: TForm5 ...@@ -41697,7 +41697,7 @@ object Form5: TForm5
HitTest = False HitTest = False
Opacity = 0.400000005960464500 Opacity = 0.400000005960464500
Size.Width = 1000.000000000000000000 Size.Width = 1000.000000000000000000
Size.Height = 591.000000000000000000 Size.Height = 592.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
WrapMode = Stretch WrapMode = Stretch
end end
...@@ -81783,7 +81783,7 @@ object Form5: TForm5 ...@@ -81783,7 +81783,7 @@ object Form5: TForm5
end end
object Panel1: TPanel object Panel1: TPanel
Align = Bottom Align = Bottom
Position.Y = 541.000000000000000000 Position.Y = 542.000000000000000000
Size.Width = 1000.000000000000000000 Size.Width = 1000.000000000000000000
Size.Height = 50.000000000000000000 Size.Height = 50.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
...@@ -81822,7 +81822,6 @@ object Form5: TForm5 ...@@ -81822,7 +81822,6 @@ object Form5: TForm5
Touch.InteractiveGestures = [LongTap, DoubleTap] Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Left Align = Left
TabOrder = 0 TabOrder = 0
Text = '/storage/emulated/0/'#25277#22870#21517#21333'.txt'
Position.Y = 9.000000000000000000 Position.Y = 9.000000000000000000
Size.Width = 353.000000000000000000 Size.Width = 353.000000000000000000
Size.Height = 32.000000000000000000 Size.Height = 32.000000000000000000
...@@ -81932,7 +81931,7 @@ object Form5: TForm5 ...@@ -81932,7 +81931,7 @@ object Form5: TForm5
Enabled = False Enabled = False
Hint = #25277#22870#21517#21333 Hint = #25277#22870#21517#21333
Size.Width = 200.000000000000000000 Size.Width = 200.000000000000000000
Size.Height = 541.000000000000000000 Size.Height = 542.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
StyleLookup = 'listboxstyle' StyleLookup = 'listboxstyle'
TabOrder = 5 TabOrder = 5
...@@ -81950,7 +81949,7 @@ object Form5: TForm5 ...@@ -81950,7 +81949,7 @@ object Form5: TForm5
DefaultItemStyles.GroupHeaderStyle = 'listboxgroupheader' DefaultItemStyles.GroupHeaderStyle = 'listboxgroupheader'
DefaultItemStyles.GroupFooterStyle = '' DefaultItemStyles.GroupFooterStyle = ''
Viewport.Width = 200.000000000000000000 Viewport.Width = 200.000000000000000000
Viewport.Height = 541.000000000000000000 Viewport.Height = 542.000000000000000000
object ListBoxItem1: TListBoxItem object ListBoxItem1: TListBoxItem
IsSelected = True IsSelected = True
ItemData.Bitmap.PNG = { ItemData.Bitmap.PNG = {
...@@ -82063,14 +82062,14 @@ object Form5: TForm5 ...@@ -82063,14 +82062,14 @@ object Form5: TForm5
HitTest = False HitTest = False
Position.X = 922.000000000000000000 Position.X = 922.000000000000000000
Size.Width = 78.000000000000000000 Size.Width = 78.000000000000000000
Size.Height = 541.000000000000000000 Size.Height = 542.000000000000000000
Size.PlatformDefault = False Size.PlatformDefault = False
StyleLookup = 'memostyle' StyleLookup = 'memostyle'
TabOrder = 3 TabOrder = 3
ParentShowHint = False ParentShowHint = False
ShowHint = True ShowHint = True
Viewport.Width = 68.000000000000000000 Viewport.Width = 68.000000000000000000
Viewport.Height = 531.000000000000000000 Viewport.Height = 532.000000000000000000
end end
object opd_names: TOpenDialog object opd_names: TOpenDialog
DefaultExt = '*.txt' DefaultExt = '*.txt'
...@@ -5,21 +5,14 @@ interface ...@@ -5,21 +5,14 @@ interface
uses uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
System.Permissions, System.Permissions,
{$IFDEF ANDROID}
FMX.Platform.Android,
Androidapi.JNI.Net, FMX.Platform,
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
Androidapi.JNIBridge,
Androidapi.Helpers,
Androidapi.JNI.Telephony ,FMX.PhoneDialer, Androidapi.JNI.Os,
{$ENDIF}
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListView.Types, FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListView.Types,
FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView,
FMX.ScrollBox, FMX.Memo,FMX.DialogService, FMX.Layouts, FMX.ListBox, FMX.ScrollBox, FMX.Memo,FMX.Layouts, FMX.ListBox,
System.ImageList, FMX.ImgList, FMX.Ani, FMX.Objects, FMX.Effects, System.ImageList, FMX.ImgList, FMX.Ani, FMX.Objects, FMX.Effects,
FMX.Memo.Types, FMX.Edit, FMX.Media; FMX.Memo.Types, FMX.Edit, FMX.Media,
FMX.MediaLibrary.Actions,
FMX.Filter.Effects, FMX.Filter;
type type
TForm5 = class(TForm) TForm5 = class(TForm)
...@@ -55,7 +48,14 @@ type ...@@ -55,7 +48,14 @@ type
private private
tmpi:Integer; tmpi:Integer;
musicName:String; musicName:String;
FPermissionReadExternalStorage,
FPermissionWriteExternalStorage: string;
procedure DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
procedure LoadListPermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
procedure LoadSongPermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
public public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure LoadList(); procedure LoadList();
end; end;
...@@ -64,19 +64,66 @@ var ...@@ -64,19 +64,66 @@ var
implementation implementation
uses
{$IFDEF ANDROID}
Androidapi.Helpers,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.Os,
{$ENDIF}
FMX.DialogService;
{$R *.fmx} {$R *.fmx}
constructor TForm5.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{$IFDEF ANDROID}
FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
{$ENDIF}
end;
destructor TForm5.Destroy;
begin
inherited Destroy;
end;
// Optional rationale display routine to display permission requirement rationale to the user
procedure TForm5.DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
var
I: Integer;
RationaleMsg: string;
begin
for I := 0 to High(APermissions) do
begin
if APermissions[I] = FPermissionWriteExternalStorage then
RationaleMsg := RationaleMsg + 'The app needs to save files to your device' + SLineBreak
else if APermissions[I] = FPermissionReadExternalStorage then
RationaleMsg := RationaleMsg + 'The app needs to load files from your device' + SLineBreak;
end;
// Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response!
// After the user sees the explanation, invoke the post-rationale routine to request the permissions
TDialogService.ShowMessage(RationaleMsg,
procedure(const AResult: TModalResult)
begin
APostRationaleProc;
end)
end;
procedure TForm5.LoadList(); procedure TForm5.LoadList();
var var
i:Integer; i:Integer;
aFStream:TFileStream;
begin begin
if FileExists(edit1.Text.Trim) then if FileExists(Edit1.Text) then
begin begin
FloatAnimation3.Enabled:=false; FloatAnimation3.Enabled:=false;
lbl_winner.Visible:=false; lbl_winner.Visible:=false;
aFStream:=TFileStream.Create(Edit1.Text,fmOpenRead);
mem_names.Lines.Clear; mem_names.Lines.Clear;
mem_names.Lines.LoadFromFile(edit1.Text.Trim,TEncoding.UTF8); mem_names.Lines.LoadFromStream(aFStream,TEncoding.UTF8);
mem_names.Text:= mem_names.Text.Trim; mem_names.Text:= mem_names.Text.Trim;
FreeAndNil(aFStream);
lsb_names.Items.Clear; lsb_names.Items.Clear;
mem_winners.Lines.Clear; mem_winners.Lines.Clear;
GlowEffect1.Enabled:=false; GlowEffect1.Enabled:=false;
...@@ -95,42 +142,7 @@ begin ...@@ -95,42 +142,7 @@ begin
end; end;
procedure TForm5.FormCreate(Sender: TObject); procedure TForm5.FormCreate(Sender: TObject);
{$IFDEF ANDROID}
var
FPermissionReadExternalStorage,FPermissionWriteExternalStorage:String;
{$ENDIF}
begin begin
{$IFDEF ANDROID}
//FPermissionCamera := JStringToString(TJManifest_permission.JavaClass.CAMERA);
FPermissionReadExternalStorage := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE);
FPermissionWriteExternalStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
PermissionsService.RequestPermissions([FPermissionReadExternalStorage,FPermissionWriteExternalStorage],
procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
var
i:Integer;
allok:Boolean;
begin
allok:=true;
for i:=0 to Length(AGrantResults)-1 do
begin
if (AGrantResults[i] <> TPermissionStatus.Granted) then
begin
allok:=false;
break;
end
end;
if allok then
begin
TDialogService.ShowMessage('STORAGE permission granted, OK.');
end
else
begin
TDialogService.ShowMessage('STORAGE permission not granted !!!');
end;
end);
{$ENDIF}
mem_names.Lines.Clear; mem_names.Lines.Clear;
mem_winners.Lines.Clear; mem_winners.Lines.Clear;
...@@ -139,7 +151,8 @@ begin ...@@ -139,7 +151,8 @@ begin
GlowEffect1.Enabled:=false; GlowEffect1.Enabled:=false;
ShadowEffect1.Enabled:=false; ShadowEffect1.Enabled:=false;
FloatAnimation3.Enabled:=false; FloatAnimation3.Enabled:=false;
musicName:='/storage/emulated/0/背景音乐.mp3'; musicName:='/storage/emulated/0/ACMusic.mp3';
Edit1.Text :='/storage/emulated/0/ACList.txt';
end; end;
procedure TForm5.spb_goClick(Sender: TObject); procedure TForm5.spb_goClick(Sender: TObject);
...@@ -211,24 +224,12 @@ end; ...@@ -211,24 +224,12 @@ end;
procedure TForm5.spb_loadmusicClick(Sender: TObject); procedure TForm5.spb_loadmusicClick(Sender: TObject);
begin begin
if opd_music.Execute then PermissionsService.RequestPermissions([FPermissionReadExternalStorage, FPermissionWriteExternalStorage], LoadSongPermissionRequestResult, DisplayRationale);
begin
musicName:=opd_music.FileName;
end;
if FileExists(musicName) then
begin
MediaPlayer1.Stop;
MediaPlayer1.FileName:=musicName;
end;
end; end;
procedure TForm5.spb_loadnameClick(Sender: TObject); procedure TForm5.spb_loadnameClick(Sender: TObject);
begin begin
if opd_names.Execute then PermissionsService.RequestPermissions([FPermissionReadExternalStorage, FPermissionWriteExternalStorage], LoadListPermissionRequestResult, DisplayRationale);
begin
edit1.Text:=opd_names.FileName;
end;
LoadList();
end; end;
procedure TForm5.Timer1Timer(Sender: TObject); procedure TForm5.Timer1Timer(Sender: TObject);
...@@ -240,4 +241,43 @@ begin ...@@ -240,4 +241,43 @@ begin
Application.ProcessMessages; Application.ProcessMessages;
end; end;
procedure TForm5.LoadListPermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
begin
// 2 permissions involved: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE
if (Length(AGrantResults) = 2) and
(AGrantResults[0] = TPermissionStatus.Granted) and
(AGrantResults[1] = TPermissionStatus.Granted) then
begin
if opd_names.Execute then
begin
Edit1.Text:=opd_names.FileName;
end;
LoadList();
end
else
TDialogService.ShowMessage('Cannot load list, the required permissions are not granted');
end;
procedure TForm5.LoadSongPermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
begin
// 2 permissions involved: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE
if (Length(AGrantResults) = 2) and
(AGrantResults[0] = TPermissionStatus.Granted) and
(AGrantResults[1] = TPermissionStatus.Granted) then
begin
if opd_music.Execute then
begin
musicName:=opd_music.FileName;
end;
if FileExists(musicName) then
begin
MediaPlayer1.Stop;
MediaPlayer1.FileName:=musicName;
MediaPlayer1.Play;
end;
end
else
TDialogService.ShowMessage('Cannot load song, the required permissions are not granted');
end;
end. end.
此差异已折叠。
此差异已折叠。
...@@ -5,4 +5,7 @@ ...@@ -5,4 +5,7 @@
<Transaction>1899-12-30 00:00:00.000.439,=C:\Users\Shion\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction> <Transaction>1899-12-30 00:00:00.000.439,=C:\Users\Shion\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
<Transaction>1899-12-30 00:00:00.000.173,=C:\Users\Shion\Documents\Embarcadero\Studio\Projects\Lottery\Unit1.pas</Transaction> <Transaction>1899-12-30 00:00:00.000.173,=C:\Users\Shion\Documents\Embarcadero\Studio\Projects\Lottery\Unit1.pas</Transaction>
</Transactions> </Transactions>
<ActiveMobileDevice>
<NoProfile Android64=""/>
</ActiveMobileDevice>
</BorlandProject> </BorlandProject>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册