尝试更改 chromium 中加载的网站时如何解决缺少 X 服务器或 $DISPLAY

尝试更改 chromium 中加载的网站时如何解决缺少 X 服务器或 $DISPLAY

我是使用覆盆子的新手,我正在使用 chilipie-kiosk 在覆盆子 pi 上开发一个信息亭。这个想法是,当 Raspberry Pi 启动时,Chromium 浏览器将启动,并带有我们在 Apache 服务器(本地主机)上的页面。我们通过以下配置(.xsession)实现这一切:


#!/bin/bash

## Establece la variable de entorno DISPLAY para que los programas X11 sepan dónde mostrar su interfaz gráfica. En este caso, :0.0 indica que el servidor de visualización X11 local está en la pantalla 0.
export DISPLAY=:0.0

# Start cursor at the top-left corner, as opposed to the default of dead-center
# (so it doesn't accidentally trigger hover styles on elements on the page)
xdotool mousemove 0 0

# Set some useful X preferences
xset s off # don't activate screensaver
xset -dpms # disable DPMS (Energy Star) features.
xset s noblank # don't blank the video device

# Set X screen background: Unicornio
sudo nitrogen --set-centered background.png

# Hide cursor afer 5 seconds of inactivity
unclutter -idle 5 -root &

# Make sure Chromium profile is marked clean, even if it crashed

# Verifica si el archivo de preferencias de chromium existe: .config/chromium/Default/
if [ -f .config/chromium/Default/Preferences ]; then
    # Existe: cat .config/chromium/Default/Preferences (en la .5 existe este archivo)
    # jq procesa el json de preferencias y se cambian exit_type y exited_cleanly
    # Se redirige la salida del comando jq a .config/chromium/Default/Preferences-clean    
    cat .config/chromium/Default/Preferences \
        | jq '.profile.exit_type = "SessionEnded" | .profile.exited_cleanly = true' \
        > .config/chromium/Default/Preferences-clean
    # Se renombra el archivo eliminando la extension -clean del nombre del archivo
    mv .config/chromium/Default/Preferences{-clean,}
fi

# Remove notes of previous sessions, if any
# Busca y elimina cualquier archivo dentro del directorio .config/chromium/ cuyo nombre comience con "Last 
find .config/chromium/ -name "Last *" -exec rm {} +

# Get URL from file (if set)
URL=""

# no parece que exista en .5: /boot/chilipie_url.txt
if [ -f /boot/chilipie_url.txt ]; then
    URL="$(head -n 1 /boot/chilipie_url.txt)"
elif [ -f /home/pi/chilipie_url.txt ]; then
    # Extrae la primera linea
    URL="$(head -n 1 /home/pi/chilipie_url.txt)"
fi


if [ -n "$URL" ]; then
    # URL no vacia: Obtiene el numero de serie de la raspberry pi
    SERIAL="$(cat /proc/cpuinfo | grep Serial | cut -d ' ' -f 2 | xargs)" # Get serial number

    # Reemplaza la variable SERIAL en la URL (si está presente) con el número de serie del dispositivo: http://example.com/?serial=$SERIAL deberia cambiar por http://example.com/?serial=10000000f9f937b8
    URL="$(echo $URL | SERIAL=$SERIAL envsubst '$SERIAL')"
fi

# Start and detach Chromium
# http://peter.sh/experiments/chromium-command-line-switches/
# Note that under matchbox, starting in full-screen without a window size doesn't behave well when you try to exit full screen (see https://unix.stackexchange.com/q/273989)
chromium-browser \
  --start-fullscreen \
  --window-position=9000,9000 \
  --disable-infobars \
  --kiosk\
  --overscroll-history-navigation=0 \
  --check-for-update-interval=1 --simulate-critical-update \ $URL &
# See https://github.com/futurice/chilipie-kiosk/issues/99#issuecomment-597119842 for 
# the need for the fishy-sounding "--check-for-update-interval=1 
# --simulate-critical-update" switches; TODO: remove when not needed
 
# Hide Chromium while it's starting/loading the page
wid=`xdotool search --sync --onlyvisible --class chromium`
xdotool windowunmap $wid
sleep 10 # give the web page time to load
xdotool windowmap $wid

# Finally, switch process to our window manager
exec matchbox-window-manager -use_titlebar no

到目前为止,它似乎运行良好。

我有 java 代码,其中执行时,我希望它更改显示的本地网站并向我显示 google.es:

            String url = "https://www.google.com/?hl=es";

            // Comando para abrir Chromium en modo kiosco con la URL de Google
            String command = "chromium-browser --start-fullscreen --kiosk --new-window --no-sandbox " + url;

            // Ejecutar el comando en el sistema operativo
            Process process = Runtime.getRuntime().exec(command);
            
            LogManager.getInstance().println(LogManager.INFO, "intenta ejecutar la llamada a google.es");

            
            // Capturar la salida de Chromium
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            
         // Capturar la salida de error de Chromium
            InputStream errorStream = process.getErrorStream();
            BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream));

            
            String line = "";
            
            while ((line = reader.readLine()) != null) {
                LogManager.getInstance().println(LogManager.INFO, "Salida estándar: " + line);
            }
            
            while ((line = errorReader.readLine()) != null) {
                LogManager.getInstance().println(LogManager.ERROR, "Salida de error: " + line);
            }

但是,我总是收到错误:

[2099:2099:0322/164415.631324:ERROR:ozone_platform_x11.cc(243)] Missing X server or $DISPLAY
03/22/2024 16:44:15 --> ERROR: [2099:2099:0322/164415.631658:ERROR:env.cc(257)] The platform failed to initialize. Exiting.

我通过 ssh 使用用户 pi 连接到树莓派。我修改了/etc/environment并添加了DISPLAY=:0。我也在/etc/environment.d/90qt-a11y.conf中完成了它

/etc/X11/Xwrapper.config我已经设置 allowed_users=anybody

如果我跑主机我有:

access control enabled, only authorized clients can connect
YES:localuser:pi

从我的无知来看,一切似乎都很好。

有人帮我解决这个错误

相关内容