2013-03-08 42 views
13

Mã này được sử dụng để hoạt động nhưng trên Android 4.2 và OpenCV 2.4.4 không thành công, nhưng tôi không biết tại sao. Có ai có thể làm sáng tỏ nó cho tôi không?Android: OpenCV: imwrite luôn trả về false và không viết

Cảm ơn bạn đã được trợ giúp.

Baz

public void SaveImage (Mat mat) { 
    Mat mIntermediateMat = new Mat(); 

    Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3); 

    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    String filename = "barry.png"; 
    File file = new File(path, filename); 

    Boolean bool = null; 
    filename = file.toString(); 
    bool = Highgui.imwrite(filename, mIntermediateMat); 

    if (bool == true) 
    Log.d(TAG, "SUCCESS writing image to external storage"); 
    else 
    Log.d(TAG, "Fail writing image to external storage"); 
    } 

bool trở lại sai mỗi lần. Đường dẫn/tên tệp phải là ("storage/emulated/0/Pictures/barry.png") cho User # 0 và thư mục Pictures có đó.

Điều gì có thể khiến hiển thị trả về sai?

Tôi có thể chuyển đổi mat thành bmp và lưu nó (mà tôi làm ở nơi khác trong ứng dụng không phải OpenCV) nhưng kể từ Highgui.imwrite là ở đó, và mã này được sử dụng để làm việc khi tôi đang viết đến 2.4.0 và thử nghiệm trên Android 3.x, tôi muốn sử dụng nó nếu có thể.

Rất cám ơn

Baz

Trả lời

16

Tôi không thể tin điều đó. [facepalm].

Thêm này để biểu hiện tập tin Barry của bạn:

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

ai đó sẽ đến và tát tôi xin vui lòng? Tôi đã quản lý để xóa giấy phép ghi khỏi tệp kê khai để thực sự không có bất kỳ điều gì ngạc nhiên khi nó không viết ...

Doh.

Barry

+0

-JILL! -Barreeeeeh. https://www.youtube.com/watch?v=FLU77yQopL8 – Sipty

5

Thực tế, có hai vấn đề có thể:

  1. quyền Android. Để khắc phục vấn đề này thêm phép manifest

    "android.permission.WRITE_EXTERNAL_STORAGE"

  2. Bạn đang cố gắng để lưu tập tin vào thẻ SD và thiết bị của bạn được kết nối với máy tính trong "ổ đĩa" chế độ . Nó có nghĩa là bạn chia sẻ quyền truy cập với PC. Kết nối thiết bị của bạn ở chế độ "Chỉ sạc". Để kiểm tra các chế độ kết nối sử dụng

    Environment.getExternalStorageState(), nó sẽ trở lại chia sẻ cho "chế độ Disk" và gắn cho "Charge only".

    tôi đổi mã của bạn và bây giờ có vẻ như

    public void SaveImage (Mat mat) { 
        Mat mIntermediateMat = new Mat(); 
        Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3); 
    
        File path = new File(Environment.getExternalStorageDirectory() + "/Images/"); 
        path.mkdirs(); 
        File file = new File(path, "image.png"); 
    
        filename = file.toString(); 
        Boolean bool = Highgui.imwrite(filename, mIntermediateMat); 
    
        if (bool) 
        Log.i(TAG, "SUCCESS writing image to external storage"); 
        else 
        Log.i(TAG, "Fail writing image to external storage"); 
    } 
    
0

Hãy chăm sóc với các phiên bản 4,4 (KitKat) vì android.permission.WRITE_EXTERNAL_STORAGE không cho phép viết trên thẻ SD bên ngoài:

Quyền WRITE_EXTERNAL_STORAGE chỉ được cấp quyền ghi vào bộ nhớ ngoài chính trên thiết bị.Ứng dụng không được phép ghi vào thiết bị lưu trữ bên ngoài thứ cấp, ngoại trừ trong thư mục gói cụ thể của chúng tôi như được cho phép bởi các quyền tổng hợp. Hạn chế ghi theo cách này đảm bảo hệ thống có thể xóa các tệp khi các ứng dụng được gỡ cài đặt.

Hãy xem để: Writing to SD Card always failing

0

Từ Android 6+

Bắt đầu từ Android 6.0 (API mức 23), người dùng cấp quyền truy cập vào các ứng dụng trong khi các ứng dụng đang chạy, không phải khi họ cài đặt ứng dụng ...

Và bạn cần phải thêm một cái gì đó như:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
    { 
     ActivityCompat.requestPermissions(
       this, 
       new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 
       PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); 
    } 

https://developer.android.com/training/permissions/requesting.html

Các vấn đề liên quan