2012-11-21 148 views
0

我正試圖組合一個簡單的應用程序,它可以將sd卡上的現有文件作爲備份發送給內容提供者場景。有幾個問題 - 最令人擔憂的是我不斷收到這些圖形緩衝區分配錯誤 - 看起來像試圖調用第二個活動時,圖形緩衝區分配正在使用所有內存,但我不知道爲什麼。我已經讀過在我測試的手機(Galaxy Nexus)上報告過此問題的錯誤,但我幾乎在UI上使用默認圖形 - 這是非常基本的,所以我不確定爲什麼會發生這種情況。我也是新來的,所以請原諒我,如果我忽略了這些非常明顯的東西。圖形緩衝區分配

下面是相關錯誤的代碼和錯誤日誌(編輯長度,因爲它是週期性的和非常長的)。我感謝任何幫助和/或指導 - 謝謝。

public class MainActivity extends Activity implements OnClickListener 
{ 
/** 
* This class runs in the event that the Content provider 
* step fails. This looks for the existing file generated by the 
* content class, prepares the file, and hands the file 
* to the SendData class to be emailed. 
*/ 
private static final String TAG = "MainActivity_VADataSender"; 
public static String MyDB; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
     { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
     } 

    // Create the getData intent 
    Intent intentgetData; 

    // call the life cycle events 
    // for now, inherit the settings from the parent class 
    // replace these with specifics if necessary once program is operational 
    public void onPause() 
     { 
     super.onPause(); 
     } 

    public void onResume() 
     { 
     super.onResume(); 
     } 

    public void onStop() 
     { 
     super.onStop(); 
     } 

    public void onDestroy() 
     { 
     super.onDestroy(); 
     } 

     @Override 
     public void onStart() 
     { 
      intentgetData = new Intent(MainActivity.this, SendData.class); 
      startActivity(intentgetData); 
     super.onStart(); 
     } 
     public MainActivity() throws FileMissingException 
     {   
      File sd = Environment.getExternalStorageDirectory(); 
      File data = Environment.getDataDirectory(); 

      if (sd.canWrite()) 
       { 
       // verify the paths- NOTE: may be device-specific 
       String currentDBPath = "TLC_COMMON/database.txt"; 
       String backupDBPath = "database.txt"; 
       File currentDB = new File(data, currentDBPath); 
       File backupDB = new File(sd, backupDBPath); 

       if (currentDB.exists()) 
       // make the connection 
        try 
        //set the connections 
        { 
        FileChannel src = new FileInputStream(currentDB).getChannel(); 
        FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
        dst.transferFrom(src, 0, src.size()); 
        src.close(); 
        dst.close(); 

        // use the actual file name here (not backupDB) 
        setMyDB(backupDB);   
        } 
        catch (Exception e) 
        // if connection error 
         { 
         Log.e(TAG, "ERROR 1: current database does not exist"); 
         Toast.makeText(getBaseContext(), e.getMessage(), 
           Toast.LENGTH_SHORT).show(); 
         this.finish(); 
         // halt processing 
         throw new FileMissingException(); 
         } 
       } 
       else 
       // if sd can not write 
        { 
        Log.e(TAG, "ERROR 2: SD is not writable"); 
        //Toast.makeText(getBaseContext(), e.getMessage(), 
         // Toast.LENGTH_SHORT).show(); 
        this.finish(); 
        throw new FileMissingException(); 
        } 
      // returned at line 102 
      //return MyDB; 
     } 


     // same here- get the actual file name 
    public void setMyDB(File backupDB) { 
     // TODO Auto-generated method stub 

    } 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 

    public static Object getMyDB() { 
     // TODO Auto-generated method stub 
     return MyDB; 
    } 
} 
    </CODE> 

二等:

public class SendData extends MainActivity 
{ 
public SendData() throws FileMissingException { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

private static final String TAG = "SendData_VADatasender"; 

/* Checks if external storage is available to read */ 
public boolean isExternalStorageReadable() 
    { 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state) || 
     Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) 
     { 
     return true; 
     } 
     {  
     return false; 
     } 
    } 

// Send data by email 
    public void dataGetter() throws FileMissingException 
    { 
     try 
     { 
     File sd = Environment.getExternalStorageDirectory(); 
     // verify it is saving as this file name; also path in previous class 
     String fileName = "MyDB"; 

      { 
       if (sd.canWrite()) 
        { 
        // add the File Attachment and URI (in EXTRA_TEXT) below once the program is running 
      //is this redundant to Object attachment below? 
        File attachment = new File(fileName); 
        } 
       else 
        { 
        Log.e(TAG, "Email attachment failed"); 
        //Toast.makeText(getBaseContext(), e.getMessage(), 
          //Toast.LENGTH_SHORT).show(); 

        finish(); 
        } 
      } 
     } 
     catch(Exception e) 
     { 
     Log.e(TAG,"ERROR 5: Could not locate file"); 
     Toast.makeText(getBaseContext(), e.getMessage(), 
       Toast.LENGTH_SHORT).show(); 

     finish(); 
     throw new FileMissingException(); 
     } 
    } 

     Intent email; 

     @Override 
     public void onStart(){ 
     //Uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), MyDB)); 
      { 
     Object attachment = MainActivity.getMyDB(); 

       { 
      Intent email = new Intent(Intent.ACTION_SENDTO); 
      email.putExtra(android.content.Intent.EXTRA_SUBJECT, "Exercise data"); 
      email.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); 
      email.putExtra(android.content.Intent.EXTRA_TEXT, (Boolean) (attachment)); //Uri.fromFile(attachment) 
      //email.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse((String) attachment)); 
      //email.setType("message/rfc822"); 
      email.setType("text/plain"); 
      startActivity(Intent.createChooser(email, "Send the exercise data:")); 
      super.onStart(); 
       } 
      } 
     } 

    public void finish() 
     { 
     } 
    } 

ERROR LOG: 

11-21 12:21:54.367: I/ActivityManager(2448): START {act=android.intent.action.MAIN cat= 

[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.va.datasender/.MainActivity 

u=0} from pid 2640 
11-21 12:21:54.468: E/MainActivity_VADataSender(4040): ERROR: current database does not exist 
11-21 12:21:54.492: I/ActivityManager(2448): START {act=android.intent.action.CHOOSER 

cmp=android/com.android.internal.app.ChooserActivity (has extras) u=0} from pid 4040 
11-21 12:21:54.500: I/ActivityManager(2448): START {cmp=com.example.va.datasender/.SendData 

u=0} from pid 4040 
11-21 12:21:54.585: E/MainActivity_VADataSender(4040): ERROR: current database does not exist 

....repeats...then graphics errors 

11-21 12:21:57.265: I/ActivityManager(2448): START {cmp=com.example.va.datasender/.SendData 

u=0} from pid 4040 
11-21 12:21:57.359: E/IMGSRV(121): :0: PVRSRVAllocDeviceMem: Error 1 returned 
11-21 12:21:57.359: E/IMGSRV(121): :0: GenericAlloc: Failed to allocate device memory 
11-21 12:21:57.359: W/GraphicBufferAllocator(121): alloc(720, 1184, 5, 00000b00, ...) failed - 

12 (Out of memory) 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): Allocated buffers: 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40b0cc40: 3404.00 KiB | 720 (736) x 1184 

|  5 | 0x00000b00 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40b1e6d8: 3404.00 KiB | 720 (736) x 1184 

|  5 | 0x00000b00 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40bb5898: 3404.00 KiB | 720 (736) x 1184 

|  5 | 0x00000b00 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40bb5a90: 3404.00 KiB | 720 (736) x 1184 

|  5 | 0x00000b00 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40bb5f18: 3404.00 KiB | 720 (736) x 1184 

|  5 | 0x00000b00 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40bb6ec8: 3404.00 KiB | 720 (736) x 1184 

|  5 | 0x00000b00 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40bba990: 1213.25 KiB | 720 (736) x 422 

|  1 | 0x00000933 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40bbb428: 3404.00 KiB | 720 (736) x 1184 

|  5 | 0x00000b00 
... 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40c06b58: 1279.38 KiB | 720 (736) x 445 

|  1 | 0x00000933 
11-21 12:21:57.359: D/GraphicBufferAllocator(121): 0x40c0e778: 143.75 KiB | 720 (736) 
11-21 12:21:57.359: E/SurfaceFlinger(121): GraphicBufferAlloc::createGraphicBuffer(w=720, 

h=1184) failed (Out of memory), handle=0x0 
11-21 12:21:57.359: E/BufferQueue(121): 

[com.example.va.datasender/com.example.va.datasender.SendData] dequeueBuffer: 

SurfaceComposer::createGraphicBuffer failed 
11-21 12:21:57.359: E/IMGSRV(4040): :0: DequeueLockStoreBuffer: Failed to de-queue buffer 
11-21 12:21:57.359: W/HardwareRenderer(4040): EGL error: EGL_BAD_NATIVE_WINDOW 
11-21 12:21:57.375: W/HardwareRenderer(4040): Mountain View, we've had a problem here. 

Switching back to software rendering. 

...then out of memory errors... 

11-21 12:21:57.453: E/SurfaceFlinger(121): GraphicBufferAlloc::createGraphicBuffer(w=720, 

h=1184) failed (Out of memory), handle=0x0 
11-21 12:21:57.453: E/BufferQueue(121): 

[com.example.va.datasender/com.example.va.datasender.SendData] dequeueBuffer: 

SurfaceComposer::createGraphicBuffer failed 
11-21 12:21:57.453: E/IMGSRV(4040): :0: DequeueLockStoreBuffer: Failed to de-queue buffer 
11-21 12:21:57.453: E/libEGL(4040): eglMakeCurrent:534 error 3003 (EGL_BAD_ALLOC) 
11-21 12:21:57.460: E/ViewRootImpl(4040): OutOfResourcesException initializing HW surface 
11-21 12:21:57.460: E/ViewRootImpl(4040): android.view.Surface$OutOfResourcesException: 

eglMakeCurrent failed EGL_BAD_ALLOC 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.HardwareRenderer 

$GlRenderer.createEglSurface(HardwareRenderer.java:920) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.HardwareRenderer 

$GlRenderer.initialize(HardwareRenderer.java:748) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.ViewRootImpl.performTraversals 

(ViewRootImpl.java:1505) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.ViewRootImpl.doTraversal 

(ViewRootImpl.java:998) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.ViewRootImpl 

$TraversalRunnable.run(ViewRootImpl.java:4212) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.Choreographer 

$CallbackRecord.run(Choreographer.java:725) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.Choreographer.doCallbacks 

(Choreographer.java:555) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.Choreographer.doFrame 

(Choreographer.java:525) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.view.Choreographer 

$FrameDisplayEventReceiver.run(Choreographer.java:711) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.os.Handler.handleCallback 

(Handler.java:615) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.os.Handler.dispatchMessage 

(Handler.java:92) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.os.Looper.loop(Looper.java:137) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at android.app.ActivityThread.main 

(ActivityThread.java:4745) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at java.lang.reflect.Method.invokeNative(Native 

Method) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at java.lang.reflect.Method.invoke 

(Method.java:511) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at com.android.internal.os.ZygoteInit 

$MethodAndArgsCaller.run(ZygoteInit.java:786) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at com.android.internal.os.ZygoteInit.main 

(ZygoteInit.java:553) 
11-21 12:21:57.460: E/ViewRootImpl(4040): at dalvik.system.NativeStart.main(Native 

Method) 
11-21 12:21:57.460: I/Process(4040): Sending signal. PID: 4040 SIG: 9 
11-21 12:21:57.460: I/WindowManager(2448): Out of memory for surface! Looking for leaks... 
11-21 12:21:57.460: W/WindowManager(2448): No leaked surfaces; killing applicatons! 
11-21 12:21:57.460: W/ActivityManager(2448): Killing processes Free memory at adjustment 5 
11-21 12:21:57.460: W/ViewRootImpl(4040): No processes killed for memory; killing self 
11-21 12:21:57.500: I/WindowState(2448): WIN DEATH: Window{41d5aa70 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
11-21 12:21:57.500: W/WindowManager(2448): Due to memory failure, waiting a bit for next layout 
11-21 12:21:57.500: W/InputDispatcher(2448): channel '41da3af0 

com.example.va.datasender/com.example.va.datasender.SendData (server)' ~ Consumer closed input 

channel or an error occurred. events=0x9 
11-21 12:21:57.500: E/InputDispatcher(2448): channel '41da3af0 

com.example.va.datasender/com.example.va.datasender.SendData (server)' ~ Channel is 

unrecoverably broken and will be disposed! 
11-21 12:21:57.500: I/ActivityManager(2448): Process com.example.va.datasender (pid 4040) has 

died. 
11-21 12:21:57.507: W/ActivityManager(2448): Force removing ActivityRecord{41e80dd0 

com.example.va.datasender/.SendData}: app died, no saved state 
11-21 12:21:57.757: W/InputDispatcher(2448): Attempted to unregister already unregistered input 

channel '41da3af0 com.example.va.datasender/com.example.va.datasender.SendData (server)' 
11-21 12:21:57.757: I/WindowState(2448): WIN DEATH: Window{41da3af0 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
11-21 12:21:57.773: I/WindowState(2448): WIN DEATH: Window{41deb038 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
11-21 12:21:57.773: I/WindowState(2448): WIN DEATH: Window{41e75500 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
11-21 12:21:57.773: I/WindowState(2448): WIN DEATH: Window{41d296a8 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
11-21 12:21:57.781: I/WindowState(2448): WIN DEATH: Window{41ca39c8 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
11-21 12:21:57.781: I/WindowState(2448): WIN DEATH: Window{41a35a18 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
11-21 12:21:57.804: W/InputDispatcher(2448): channel '41caaec8 

com.example.va.datasender/com.example.va.datasender.SendData (server)' ~ Consumer closed input 

channel or an error occurred. events=0x9 
11-21 12:21:57.804: E/InputDispatcher(2448): channel '41caaec8 

com.example.va.datasender/com.example.va.datasender.SendData (server)' ~ Channel is 

unrecoverably broken and will be disposed! 

...then worse errors... 

11-21 12:21:57.828: I/WindowState(2448): WIN DEATH: Window{41dd0130 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} 
11-21 12:21:57.835: E/InputDispatcher(2448): Received spurious receive callback for unknown 

input channel. fd=244, events=0x9 
11-21 12:21:57.835: E/InputDispatcher(2448): Received spurious receive callback for unknown 

input channel. fd=225, events=0x9 
11-21 12:21:57.835: E/InputDispatcher(2448): Received spurious receive callback for unknown 

input channel. fd=217, events=0x9 
11-21 12:21:57.835: E/InputDispatcher(2448): Received spurious receive callback for unknown 

input channel. fd=258, events=0x9 
11-21 12:21:57.835: E/InputDispatcher(2448): Received spurious receive callback for unknown 

input channel. fd=259, events=0x9 
11-21 12:21:57.835: E/InputDispatcher(2448): Received spurious receive callback for unknown 

input channel. fd=260, events=0x9 

...then it crashes... 

11-21 12:21:57.843: W/ActivityManager(2448): Force removing ActivityRecord{41714778 

com.example.va.datasender/.SendData}: app died, no saved state 
11-21 12:21:57.843: W/ActivityManager(2448): Force removing ActivityRecord{41a69f30 

com.example.va.datasender/.SendData}: app died, no saved state 
11-21 12:21:57.843: W/ActivityManager(2448): Force removing ActivityRecord{41c65b30 

com.example.va.datasender/.SendData}: app died, no saved state 
11-21 12:21:57.859: D/dalvikvm(4289): Late-enabling CheckJNI 
11-21 12:21:57.859: I/ActivityManager(2448): Displayed com.example.va.datasender/.SendData: 

+3s356ms (total +3s395ms) 
11-21 12:21:57.859: I/ActivityManager(2448): Displayed com.example.va.datasender/.SendData: 

+3s149ms 
11-21 12:21:57.859: I/ActivityManager(2448): Displayed com.example.va.datasender/.SendData: 

+1s657ms 
11-21 12:21:57.859: I/ActivityManager(2448): Displayed com.example.va.datasender/.SendData: 

+2s540ms 
11-21 12:21:57.859: I/ActivityManager(2448): Displayed com.example.va.datasender/.SendData: 

+977ms 

...leaked surface errors... 

11-21 12:21:58.343: W/WindowManager(2448): LEAKED SURFACE (app token hidden): Window{41d2df50 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} surface=Surface 

(name=com.example.va.datasender/com.example.va.datasender.SendData, identity=1350) 

token=AppWindowToken{41cc7c48 token=Token{4198ba08 ActivityRecord{41ca22a8 

com.example.va.datasender/.SendData}}} 
11-21 12:21:58.343: W/WindowManager(2448): LEAKED SURFACE (app token hidden): Window{41d5e1b0 

com.example.va.datasender/com.example.va.datasender.SendData paused=false} surface=Surface 

(name=com.example.va.datasender/com.example.va.datasender.SendData, identity=1351) 

token=AppWindowToken{41c78878 token=Token{419e78f8 ActivityRecord{41cd1208 

com.example.va.datasender/.SendData}}} 

回答

-1

的問題是,您的圖形內存是不夠的。重新啓動您的手機將解決此問題。