东方仙盟接听电话主界面代码

package com.fairyalliance.smartanswer;

import android.Manifest;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;


import android.os.Environment;
 

import java.io.File;

import java.io.FileOutputStream;

import android.content.pm.PackageManager;


import androidx.annotation.NonNull;

import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;


import CyberWinPHP.Cyber_CPU.Cyber_Public_Var;


 
import android.content.Context;
import android.content.Intent;
 
import android.media.MediaPlayer;
 
 
import android.view.View;
 
 
 
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.media.AudioAttributes;
import android.media.AudioManager;
 
 

public class MainActivity extends AppCompatActivity {

    private static final String[] PERMISSIONS_老的 = {
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_CONTACTS
    };
    
    // 仅保留 能动态授权、必须授权、不会失效 的权限
    private static final String[] PERMISSIONS = {
            Manifest.permission.READ_PHONE_STATE,    // 必须:检测来电
            Manifest.permission.READ_CONTACTS,       // 必须:读取联系人
            Manifest.permission.WRITE_CONTACTS,      // 可选:修改联系人
            Manifest.permission.READ_EXTERNAL_STORAGE ,// 必须:读取文件/录音
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
    };
        
       private static final int REQUEST_MANAGE_ALL_FILES_PERMISSION = 4;
       
       private static final int PERMISSION_CODE = 100;
       
        // 音频文件名(res/raw 目录下)
    public String audioFileName  = "fams_aa_dc_01";
    public String defaultAudio   = "fams_aa_default";
    public String audioFileName2 = "fams_aa_jyyq_01";
    public String audioFileName3 = "fams_aa_default";
    
    public String audioFileName5 = "fams_aa_dc_03";
    
    

       private MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            
             CyberWinLogToFile.init(this);
             
             writelog("MainActivity","jt","启动开始");
             
            setContentView(R.layout.activity_main);
            
              writelog("MainActivity","jt","布局");

            // 申请存储、通讯录权限
            // 检查并申请权限
            /*
        if (!hasPermissions()) {
            ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_CODE);
        }
           */

            Toast.makeText(this, "点击屏幕开启无障碍", Toast.LENGTH_SHORT).show();

        } catch (Exception e) {
            writelog("MainActivity","jt","布局"+ e.getMessage());
        }
    }
    
    //2026-04-22
      /**
     * 检查是否拥有所有权限
     */
    private boolean hasPermissions() {
        for (String p : PERMISSIONS) {
            if (ContextCompat.checkSelfPermission(this, p) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
    
    /**
     * 【必须重写】权限申请结果回调
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSION_CODE) {
            boolean allGranted = true;
            for (int result : grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    allGranted = false;
                    break;
                }
            }

            if (allGranted) {
                Toast.makeText(this, "权限已全部授权", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "请授权所有权限才能使用", Toast.LENGTH_SHORT).show();
            }
        }
    }
    
     /**
     * 【可选但推荐重写】页面返回时刷新
     */
    @Override
    protected void onResume() {
        super.onResume();
    }
    
   
    private  void 仙盟_权限_判断_文件权限() {
        // 检查系统版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            // 检查是否已经拥有管理所有文件的权限
            if (!android.os.Environment.isExternalStorageManager()) {
                // 请求管理所有文件的权限
                Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
                startActivityForResult(intent, REQUEST_MANAGE_ALL_FILES_PERMISSION);
            } else {
                Toast.makeText(this, "已经拥有管理所有文件的权限", Toast.LENGTH_SHORT).show();
            }
        } else {
            // 对于 Android 10 及以下版本,不需要该权限
            Toast.makeText(this, "此设备不需要管理所有文件的权限", Toast.LENGTH_SHORT).show();
        }
    }
    
      private void 仙盟_加载_判断文件夹(){
        try {
            // 创建 File 对象
            String filePath = "/cyberwin/归一编程/1.html";
            String filePath1 = "/cyberwin";

            File file = new File(Environment.getExternalStorageDirectory(), filePath1);

            if (!file.exists()) {
                file.mkdirs();
            }

            String filePath2 = "/cyberwin/归一编程";
            File file2 = new File(Environment.getExternalStorageDirectory(), filePath2);
            if (!file2.exists()) {
                file2.mkdirs();
            }


        }catch (Exception e) {

            Toast.makeText(this, "文件写入失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
    
     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_MANAGE_ALL_FILES_PERMISSION) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                if (android.os.Environment.isExternalStorageManager()) {
                    Toast.makeText(this, "已成功获取管理所有文件的权限", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "未获取到管理所有文件的权限", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    
     // 核心日志方法:writelog(type, name, msg);
        private void writelog(String type, String name, String msg) {
            try {
               
               
                // 1. 时间格式化:yyyy-MM-dd HH:mm:ss
              //  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
              //  String time = sdf.format(new Date());
        
                // 2. 日志内容
              //  String logContent = time + " | " + type + " | " + name + " | " + msg + "\n";
                 String logContent = type + " | " + name + " | " + msg + "\n";
                 CyberWinLogToFile.d_windows(type,name,logContent);
              
        
        
            } catch (Exception e) {
                // 不处理,避免崩溃
            }
        }
        
        //2026-04-23
        
    // ---------------------- 音频播放 ----------------------
    public void playDefaultAudio(View view) {
        playRawAudio(defaultAudio);
    }

    public void playAudio2(View view) {
        playRawAudio(audioFileName2);
    }

    public void playAudio3(View view) {
        playRawAudio(audioFileName3);
    }
    
    //
    
    public void playAudio5(View view) {
        playRawAudio(audioFileName5);
    }

    // 播放 raw 下的音频(通用方法)
    private void playRawAudio(String fileName) {
        try {
            // 先停止上一个
            if (mediaPlayer != null) {
                mediaPlayer.release();
            }

            // 获取音频 ID
            int resId = getResources().getIdentifier(fileName, "raw", getPackageName());
            mediaPlayer = MediaPlayer.create(this, resId);
            mediaPlayer.start();
            Toast.makeText(this, "正在播放:" + fileName, Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(this, "播放失败:音频文件不存在", Toast.LENGTH_SHORT).show();
        }
    }
    
     public void playAudio2byphone(View view) {
        
         try {
        // 先释放上一个
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
        
          AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
           未来之窗_设置接电话AudioManager(am);

        int resId = getResources().getIdentifier(audioFileName2, "raw", getPackageName());
        mediaPlayer = MediaPlayer.create(this, resId);

        // ======================
        // 关键:强制使用 电话通话声道
        // ======================
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mediaPlayer.setAudioAttributes(
                new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) // 电话通道
                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                    .build()
            );
            
        } else {
           
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); // 旧版本
        }
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); // 设置音频流为通话流

        mediaPlayer.start();
        Toast.makeText(this, "电话通道播放:" + audioFileName2, Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        Toast.makeText(this, "播放失败", Toast.LENGTH_SHORT).show();
    }
    }
    
     private void 未来之窗_设置接电话AudioManager(AudioManager am) {
        am.setMode(AudioManager.MODE_IN_CALL);
        am.setMode(AudioManager.MODE_IN_COMMUNICATION);
        am.setSpeakerphoneOn(true);
    }
    
      // ---------------------- 权限授权 ----------------------
    public void grantStoragePermission(View view) {
        /*
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERM_CODE);
        } else {
            Toast.makeText(this, "文件权限已授权", Toast.LENGTH_SHORT).show();
        }
        */
        仙盟_权限_判断_文件权限();
    }

    public void grantAllPermissions(View view) {
          ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_CODE);
        /*
        if (!hasAllPermissions()) {
            ActivityCompat.requestPermissions(this, PERMISSIONS, ALL_PERM_CODE);
        } else {
            Toast.makeText(this, "全部权限已授权", Toast.LENGTH_SHORT).show();
        }
        */
    }
    
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fairy Alliance answer"
        android:textSize="22sp"/>
        
          <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="播放应答默认语音"
        android:onClick="playDefaultAudio"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="播放应答 2"
        android:onClick="playAudio2"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="播放应答 3"
        android:onClick="playAudio3"/>
        
        
         <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="播放应答 5"
        android:onClick="playAudio5"/>
        
        
        <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="接听模式 2"
        android:onClick="playAudio2byphone"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="授权文件权限"
        android:onClick="grantStoragePermission"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="授权全部权限"
        android:onClick="grantAllPermissions"/>
        
        
         <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fairy Alliance 东方仙盟 5400款应用 混沌系统"
        android:textSize="22sp"/>

</LinearLayout>

人人皆为创造者,共创方能共成长

每个人都是使用者,也是创造者;是数字世界的消费者,更是价值的生产者与分享者。在智能时代的浪潮里,单打独斗的发展模式早已落幕,唯有开放连接、创意共创、利益共享,才能让个体价值汇聚成生态合力,让技术与创意双向奔赴,实现平台与伙伴的快速成长、共赢致远。

原创永久分成,共赴星辰大海


原创创意共创、永久收益分成,是东方仙盟始终坚守的核心理念。我们坚信,每一份原创智慧都值得被尊重与回馈,以永久分成锚定共创初心,让创意者长期享有价值红利,携手万千伙伴向着科技星辰大海笃定前行,拥抱硅基      生命与数字智能交融的未来,共筑跨越时代的数字文明共同体。

东方仙盟:拥抱知识开源,共筑数字新生态


在全球化与数字化浪潮中,东方仙盟始终秉持开放协作、知识共享的理念,积极拥抱开源技术与开放标准。我们相信,唯有打破技术壁垒、汇聚全球智慧,才能真正推动行业的可持续发展。

开源赋能中小商户:通过将前端异常检测、跨系统数据互联等核心能力开源化,东方仙盟为全球中小商户提供了低成本、高可靠的技术解决方案,让更多商家能够平等享受数字转型的红利。
共建行业标准:我们积极参与国际技术社区,与全球开发者、合作伙伴共同制定开放协议      与技术规范,推动跨境零售、文旅、餐饮等多业态的系统互联互通,构建更加公平、高效的数字生态。
知识普惠,共促发展:通过开源社区         、技术文档与培训体系,东方仙盟致力于将前沿技术转化为可落地的行业实践,赋能全球合作伙伴,共同培育创新人才,推动数字经济  的普惠式增长


阿雪技术观

在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者   。无论是分享代码、撰写技术博客,还是参与开源项目      维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基 生命,为科技进步添砖加瓦。

Hey folks, in this   wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just  be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets               , hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome         place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐