You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:36:03