Android Studio航空预订APP支付后生成存储收据文件方案咨询
实现方案
第一步:配置存储权限
在AndroidManifest.xml中添加对应权限:
<!-- 安卓9及以下需要 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 安卓10及以上兼容 --> <application ... android:requestLegacyExternalStorage="true">
如果不需要让用户在系统文件管理器直接找到收据,也可以直接存储到App私有外部目录,无需申请上述权限。
第二步:动态申请存储权限(安卓6.0+ 必需)
在BookingActivity中添加权限请求相关逻辑:
// 类顶部定义权限请求码 private static final int REQUEST_STORAGE_PERMISSION = 1001; // onCreate中添加权限检查 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_booking); // ...原有逻辑不变 // 检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION); } } // 处理权限请求结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_STORAGE_PERMISSION) { if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "存储权限被拒绝,无法生成收据", Toast.LENGTH_SHORT).show(); } } }
第三步:添加收据生成方法
在BookingActivity中新增生成收据的工具方法:
private void generateReceipt(String username, FlightsModel flight, double paidAmount, double remainingBalance) { // 拼接收据内容 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); String payTime = sdf.format(new Date()); String receiptContent = "===== 航空预订收据 =====\n" + "用户名称:" + username + "\n" + "航班目的地:" + flight.getDestination() + "\n" + "起飞时间:" + flight.getDeparture_time() + "\n" + "到达时间:" + flight.getArrival_time() + "\n" + "飞行时长:" + flight.getDuration() + "小时\n" + "支付金额:R" + paidAmount + "\n" + "支付时间:" + payTime + "\n" + "账户剩余余额:R" + remainingBalance + "\n" + "======================"; // 存储到公共下载目录,用户可直接查看 File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); String fileName = "机票收据_" + username + "_" + System.currentTimeMillis() + ".txt"; File receiptFile = new File(downloadDir, fileName); try { FileOutputStream fos = new FileOutputStream(receiptFile); fos.write(receiptContent.getBytes(StandardCharsets.UTF_8)); fos.close(); Toast.makeText(this, "收据已保存到下载目录:" + fileName, Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "收据生成失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
说明:当前你的航班表没有存储航班日期,暂时用支付时间作为收据生成时间,你可以后续给
FLIGHTS表新增DEPARTURE_DATE字段,升级数据库版本后即可在收据中展示航班日期。
第四步:支付成功时调用方法
找到book按钮点击事件中支付成功的分支,调用上述生成方法:
if(price <= balance){ dbHelper.setBookingByUserName(intValue, name); Toast.makeText(BookingActivity.this, "Payment successful, booking has been made", Toast.LENGTH_SHORT).show(); double newBalance; newBalance = balance - price; dbHelper.makingPayment(newBalance, name); seats = seats - 1; dbHelper.setAvailableSeatsAfterPayment(seats, intValue); // 新增调用收据生成方法 generateReceipt(name, flightsModel, price, newBalance); }else{ Toast.makeText(BookingActivity.this, "Payment unsuccessful, not enough funds", Toast.LENGTH_SHORT).show(); }
内容的提问来源于stack exchange,提问作者forsure
相关产品推荐
相关产品推荐

