Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JOGL Android应用程序可以';无法写入外部存储器_Java_Android_Jogl - Fatal编程技术网

Java JOGL Android应用程序可以';无法写入外部存储器

Java JOGL Android应用程序可以';无法写入外部存储器,java,android,jogl,Java,Android,Jogl,我有一个Android应用程序,它使用JOGL进行OpenGL图形处理。该应用程序是GearsTestDemo,在其他地方用于测试。该应用程序在两个不同的平板电脑设备上运行和显示,一个运行4.4.2,另一个运行4.1.2。我正在尝试添加文件访问权限。我拥有清单文件中指定的写入和读取权限。我可以写入本地应用程序存储(在努力获得正确的上下文后)。当我尝试写入外部存储器时,打开失败:EACCES(权限被拒绝)。下面给出了logcat输出的一个片段,显示了错误。由于清单中的权限设置似乎是正确的,因此JO

我有一个Android应用程序,它使用JOGL进行OpenGL图形处理。该应用程序是GearsTestDemo,在其他地方用于测试。该应用程序在两个不同的平板电脑设备上运行和显示,一个运行4.4.2,另一个运行4.1.2。我正在尝试添加文件访问权限。我拥有清单文件中指定的写入和读取权限。我可以写入本地应用程序存储(在努力获得正确的上下文后)。当我尝试写入外部存储器时,打开失败:EACCES(权限被拒绝)。下面给出了logcat输出的一个片段,显示了错误。由于清单中的权限设置似乎是正确的,因此JOGL似乎以某种方式干扰了应用程序的写入能力。如有任何建议,将不胜感激

以下是清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gdeb.tango.JOGL_GearsTest"
    android:versionCode="19"
    android:versionName="1.9" > 


    <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="20"/>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application android:icon="@drawable/ic_launcher" 
                 android:label="@string/app_name"
                 android:description="@string/app_descr"
                 android:persistent="false"
                 >

        <activity android:name="com.gdeb.tango.JOGL_GearsTest.JOGL_GearsTestActivityLauncher"
                  android:theme="@android:style/Theme.NoDisplay"
                  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

这是活动代码

/**
 * Copyright 2011 JogAmp Community. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of JogAmp Community.
 */
package com.gdeb.tango.JOGL_GearsTest;

import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.util.ArrayList;

import com.jogamp.opengl.GLCapabilities;
import com.jogamp.opengl.GLProfile;

import jogamp.newt.driver.android.NewtBaseActivity;

import com.jogamp.common.util.InterruptSource;
import com.jogamp.newt.event.MonitorEvent;
import com.jogamp.newt.event.MouseAdapter;
import com.jogamp.newt.event.MouseEvent;
import com.jogamp.newt.event.MonitorModeListener;
import com.jogamp.newt.opengl.GLWindow;

import com.jogamp.opengl.util.Animator;

import android.os.Bundle;
import android.util.Log;

// KRF
// test of android log4j
//import de.mindpipe.android.logging.log4j.LogConfigurator;
import android.os.Environment;
import java.io.File;
//import org.apache.log4j.Level;
import java.io.OutputStream;
import java.io.FileOutputStream;
import android.content.Context;

//public class NEWTGearsES2Activity extends NewtBaseActivity {
public class JOGL_GearsTestActivity extends NewtBaseActivity {
   //static String TAG = "NEWTGearsES2Activity";
   static String TAG = "JOGLGearsTestActivity";

   static final String forceRGBA5650 = "demo.force.rgba5650";
   static final String forceECT = "demo.force.ect";
   static final String forceKillProcessTest = "demo.force.killProcessTest";

   //   KRF
//   private LogConfigurator logConfigurator;

   @Override
   public void onCreate(final Bundle savedInstanceState) {
       Log.d(TAG, "onCreate - 0");
       super.onCreate(savedInstanceState);


       // KRF
//       logConfigurator = new LogConfigurator();
//// dump
//Log.d(TAG, Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "gears_test.txt");
//       logConfigurator.setFileName(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "gears_test.txt");
//       // Set the root log level
//       logConfigurator.setRootLevel(Level.DEBUG);
//       // Set log level of a specific logger
//       logConfigurator.setLevel("org.apache", Level.ERROR);
//       logConfigurator.setLevel("com.gdeb", Level.INFO);
//       logConfigurator.configure();

       // create GLWindow (-> incl. underlying NEWT Display, Screen & Window)
       final GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL2ES2));
       if( null != System.getProperty(forceRGBA5650) ) {
           Log.d(TAG, "forceRGBA5650");
           caps.setRedBits(5); caps.setGreenBits(6); caps.setBlueBits(5);
       }

       Log.d(TAG, "req caps: "+caps);
       final GLWindow glWindow = GLWindow.create(caps);
       glWindow.setFullscreen(true);
       setContentView(getWindow(), glWindow);

       //final GearsES2 demo = new GearsES2(-1);
       final GearsES2 demo = new GearsES2();

       // demo.enableAndroidTrace(true);
       glWindow.addGLEventListener(demo);
       glWindow.getScreen().addMonitorModeListener(new MonitorModeListener() {
           @Override
           public void monitorModeChangeNotify(final MonitorEvent me) { }
           @Override
           public void monitorModeChanged(final MonitorEvent me, final boolean success) {
               System.err.println("MonitorMode Changed (success "+success+"): "+me);
           }
       });

       if( null != System.getProperty(forceKillProcessTest) ) {
           Log.d(TAG, "not forceKillProcessTest");
       }
       else {
           Log.d(TAG, "forceKillProcessTest");
       }
           Log.d(TAG, "force forceKillProcessTest");
           glWindow.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(final MouseEvent e) {
                if( e.getPointerCount() == 3 ) {
                    Log.d(TAG, "MemoryHog");
                    new InterruptSource.Thread(null, new Runnable() {
                        public void run() {
                            final ArrayList<Buffer> buffers = new ArrayList<Buffer>();
                            while(true) {
                                //final int halfMB = 512 * 1024;
                                final int tenMB = 10 * 1024 * 1024;
                                final float osizeMB = buffers.size() * 10.0f;
                                final float nsizeMB = osizeMB + 10.0f;
                                System.err.println("MemoryHog: ****** +4k: "+osizeMB+" MB +"+nsizeMB+" MB - Try");
                                //buffers.add(ByteBuffer.allocateDirect(halfMB)); // 0.5 MB each
                                buffers.add(ByteBuffer.allocateDirect(tenMB)); // 10.0 MB each
                                System.err.println("MemoryHog: ****** +4k: "+osizeMB+" MB +"+nsizeMB+" MB - Done");
                                try {
                                    Thread.sleep(200);
                                } catch (final Exception e) { e.printStackTrace(); };
                            }
                        } }, "MemoryHog").start();
                } else if( e.getPointerCount() == 4 ) {
                    Log.d(TAG, "ForceKill");
                    android.os.Process.killProcess( android.os.Process.myPid() );
                }
            }
           });
       //}

       final Animator animator = new Animator(glWindow);
       // animator.setRunAsFastAsPossible(true);
       // glWindow.setSkipContextReleaseThread(animator.getThread());

       if( null != System.getProperty(forceECT) ) {
           Log.d(TAG, "forceECT");
           animator.setExclusiveContext(true);
       }

       glWindow.setVisible(true);

       animator.setUpdateFPSFrames(60, System.err);
       animator.resetFPSCounter();
       glWindow.resetFPSCounter();

//================================
       // KRF
       // ??? filenotfound error, permissions?
       Log.d(TAG, Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "markar" + File.separator + "test1.txt");
       File tFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "markar" + File.separator + "test1.txt");
       //File tFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test.txt");
       try {
         OutputStream outS = new FileOutputStream(tFile);
         outS.write((int) 5); 
         outS.close();
         Log.d(TAG, "writing to external test.txt");
       } catch (final Exception e) { e.printStackTrace(); };


       // Try internal storage
       try {
         //File tLFile =  this.getFileStreamPath("test.txt");
         //Log.d(TAG, tLFile.getAbsolutePath());
         //OutputStream outLS = new FileOutputStream(tLFile);

         //Context ctx = createPackageContext("com.gdeb.tango.JOGL_GearsTest", CONTEXT_IGNORE_SECURITY);
         Context ctx = getActivity().getApplicationContext();
         OutputStream outLS = ctx.openFileOutput("test.txt",MODE_PRIVATE);
         outLS.write((int) 5); 
         outLS.close();
         Log.d(TAG, "writing to internal test.txt");
       } catch (final Exception e) { e.printStackTrace(); };


//     Checks if external storage is available for read and write
       String state = Environment.getExternalStorageState();
       if (Environment.MEDIA_MOUNTED.equals(state)) {
         Log.d(TAG, "External storage available");
       }
       else {
         Log.d(TAG, "External storage NOT available");
       }

//     Checks if external storage is available to at least read
       String st = Environment.getExternalStorageState();
       if (Environment.MEDIA_MOUNTED.equals(st) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(st)) {
         Log.d(TAG, "External storage readable");
       }
       else {
         Log.d(TAG, "External storage NOT readable");
       }

//================================

       Log.d(TAG, "onCreate - X");
   }
}
/**
*版权所有2011 JogAmp社区。版权所有。
*
*在源代码和二进制格式中重新分发和使用,无论是否修改,都是必要的
*如果满足以下条件,则允许:
*
*    1. 重新分发源代码必须保留上述版权声明,此列表为
*条件和以下免责声明。
*
*    2. 以二进制形式重新分发必须复制上述版权声明,此列表
*文件和/或其他材料中的条件和以下免责声明
*提供分配。
*
*本软件由JogAmp社区“按原样”和任何明示或暗示的方式提供
*保证,包括但不限于对适销性和
*不承认适用于特定用途。在任何情况下,JogAmp社区或
*出资人对任何直接、间接、附带、特殊、示范或
*间接损害(包括但不限于采购替代货物或
*服务;使用、数据或利润损失;或业务中断),无论是何种原因造成的
*任何责任理论,无论是合同、严格责任还是侵权行为(包括
*因使用本软件而引起的任何疏忽或其他),即使
*已告知此类损坏的可能性。
*
*软件和文档中包含的观点和结论是
*作者,也不应被解释为代表官方政策
*或者暗示,是JogAmp社区的。
*/
包com.gdeb.tango.JOGL_GearsTest;
导入java.nio.Buffer;
导入java.nio.ByteBuffer;
导入java.util.ArrayList;
导入com.jogamp.opengl.gl功能;
导入com.jogamp.opengl.GLProfile;
导入jogamp.newt.driver.android.NewtBaseActivity;
导入com.jogamp.common.util.InterruptSource;
导入com.jogamp.newt.event.MonitorEvent;
导入com.jogamp.newt.event.MouseAdapter;
导入com.jogamp.newt.event.MouseEvent;
导入com.jogamp.newt.event.monitorModelListener;
导入com.jogamp.newt.opengl.GLWindow;
导入com.jogamp.opengl.util.Animator;
导入android.os.Bundle;
导入android.util.Log;
//KRF
//androidlog4j的测试
//导入de.mindpipe.android.logging.log4j.LogConfigurator;
导入android.os.Environment;
导入java.io.File;
//导入org.apache.log4j.Level;
导入java.io.OutputStream;
导入java.io.FileOutputStream;
导入android.content.Context;
//公共类newtGearSes2活动扩展了NewtBaseActivity{
公共类JOGL_GearSteactivity扩展了NewBaseActivity{
//静态字符串TAG=“newtgagerse2activity”;
静态字符串TAG=“JOGLGearsTestActivity”;
静态最终字符串forceRGBA5650=“demo.force.rgba5650”;
静态最终字符串forcect=“demo.force.ect”;
静态最终字符串forceKillProcessTest=“demo.force.killProcessTest”;
//KRF
//专用LogConfigurator LogConfigurator;
@凌驾
创建时的公共void(最终捆绑包savedInstanceState){
Log.d(标记为“onCreate-0”);
super.onCreate(savedInstanceState);
//KRF
//logConfigurator=新的logConfigurator();
////倾倒
//Log.d(TAG,Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+“gears_test.txt”);
//logConfigurator.setFileName(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+“gears_test.txt”);
////设置根日志级别
//logConfigurator.setRootLevel(Level.DEBUG);
////设置特定记录器的日志级别
//logConfigurator.setLevel(“org.apache”,Level.ERROR);
//logConfigurator.setLevel(“com.gdeb”,Level.INFO);
//logConfigurator.configure();
//创建GLWindow(->包括底层NEWT显示、屏幕和窗口)
最终GLCapabilities=新的GLCapabilities(GLProfile.get(GLProfile.GL2ES2));
if(null!=System.getProperty(forceRGBA5650)){
Log.d(标签“forceRGBA5650”);
caps.setRedBits(5);caps.setGreenBits(6);caps.setBlueBits(5);
}
日志d(标签“要求上限:”+上限);
最终GLWindow GLWindow=GLWindow.create(caps);
glWindow.setFullscreen(真);
setContentView(getWindow(),glWindow);
//最终档位SES2演示=新档位SES2(-1);
最终齿轮SES2演示=新齿轮SES2();
//demo.enableAndroidTrace(true);
glWindow.addGLEventListener(演示);
glWindow.getScreen().AddMonitorModelListener(新的MonitorModelListener()){
@凌驾
public void monitorModeChangeNotify(最终MonitorEvent me){}
@凌驾
public void monitorModeChanged(最终MonitorEvent me,最终布尔值成功){
System.err.println(“MonitorMode已更改(success”+success+”):+me);
}
});
if(null!=System.getProperty(forceKillProcessTest)){
Log.d(标签“非强制killprocesstest”);
}
否则{
Log.d(标签“forceKillProcessTest”);
}
...
...
04-15 14:26:36.023: W/System.err(7281): GLWindow.setVisibleActionPost(true, false) main-Display-.android_nil-1-EDT-5, start
04-15 14:26:36.023: W/System.err(7281): GLWindow.setVisibleActionPost(true, false) main-Display-.android_nil-1-EDT-5, fin: dt 0.144334ms
04-15 14:26:36.023: W/System.err(7281): Window setVisible: END (main-Display-.android_nil-1-EDT-5) state [visible, autopos, fullscreen, ], nativeWindowCreated: false, madeVisible: -1, geom 0/0 0x0, windowHandle 0x0
04-15 14:26:36.023: W/System.err(7281): GLWindow.resetCounter() main-Display-.android_nil-1-EDT-5
04-15 14:26:36.024: D/JOGLGearsTestActivity(7281): /storage/emulated/0/markar/test1.txt
04-15 14:26:36.024: W/System.err(7281): java.io.FileNotFoundException: /storage/emulated/0/markar/test1.txt: open failed: EACCES (Permission denied)
04-15 14:26:36.024: W/System.err(7281):     at libcore.io.IoBridge.open(IoBridge.java:409)
04-15 14:26:36.024: W/System.err(7281):     at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
04-15 14:26:36.025: W/System.err(7281):     at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
04-15 14:26:36.025: W/System.err(7281):     at com.gdeb.tango.JOGL_GearsTest.JOGL_GearsTestActivity.onCreate(JOGL_GearsTestActivity.java:176)
04-15 14:26:36.025: W/System.err(7281):     at java.lang.reflect.Method.invoke(Native Method)
04-15 14:26:36.025: W/System.err(7281):     at jogamp.android.launcher.ActivityLauncher.callMethod(ActivityLauncher.java:237)
04-15 14:26:36.025: W/System.err(7281):     at jogamp.android.launcher.ActivityLauncher.onCreate(ActivityLauncher.java:91)
04-15 14:26:36.025: W/System.err(7281):     at android.app.Activity.performCreate(Activity.java:5231)
04-15 14:26:36.025: W/System.err(7281):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-15 14:26:36.025: W/System.err(7281):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2160)
04-15 14:26:36.025: W/System.err(7281):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2246)
04-15 14:26:36.025: W/System.err(7281):     at android.app.ActivityThread.access$800(ActivityThread.java:136)
04-15 14:26:36.026: W/System.err(7281):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197)
04-15 14:26:36.026: W/System.err(7281):     at android.os.Handler.dispatchMessage(Handler.java:102)
04-15 14:26:36.026: W/System.err(7281):     at android.os.Looper.loop(Looper.java:136)
04-15 14:26:36.026: W/System.err(7281):     at android.app.ActivityThread.main(ActivityThread.java:5030)
04-15 14:26:36.026: W/System.err(7281):     at java.lang.reflect.Method.invoke(Native Method)
04-15 14:26:36.026: W/System.err(7281):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-15 14:26:36.026: W/System.err(7281):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
04-15 14:26:36.026: W/System.err(7281): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
04-15 14:26:36.026: W/System.err(7281):     at libcore.io.Posix.open(Native Method)
04-15 14:26:36.026: W/System.err(7281):     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
04-15 14:26:36.027: W/System.err(7281):     at libcore.io.IoBridge.open(IoBridge.java:393)
04-15 14:26:36.027: W/System.err(7281):     ... 18 more
04-15 14:26:36.027: D/JOGLGearsTestActivity(7281): writing to internal test.txt
04-15 14:26:36.028: D/JOGLGearsTestActivity(7281): External storage available
04-15 14:26:36.028: D/JOGLGearsTestActivity(7281): External storage readable
04-15 14:26:36.028: D/JOGLGearsTestActivity(7281): onCreate - X
04-15 14:26:36.029: D/JogAmp-ActivityLauncher(7281): onCreate - X
04-15 14:26:36.029: D/JogAmp-ActivityLauncher(7281): onStart - S
...
...