【问题标题】:Storing an image in sdcar using Aquery - Android使用 A Query 将图像存储在 sdcard 中 - Android
【发布时间】:2016-02-10 16:11:08
【问题描述】:

我正在尝试将网络中的图像存储到我的模拟器的 SD 卡中。但是,我更具体地期望空对象引用。

W/AQuery: reporting:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getAbsolutePath()' on a null object reference
                                         at testing.theo.androidqueryexample.MainActivity.handfile(MainActivity.java:69)
                                         at testing.theo.androidqueryexample.MainActivity.access$000(MainActivity.java:19)
                                         at testing.theo.androidqueryexample.MainActivity$1.callback(MainActivity.java:61)
                                         at testing.theo.androidqueryexample.MainActivity$1.callback(MainActivity.java:56)
                                         at com.androidquery.callback.AbstractAjaxCallback.callback(AbstractAjaxCallback.java:506)
                                         at com.androidquery.callback.AbstractAjaxCallback.afterWork(AbstractAjaxCallback.java:1299)
                                         at com.androidquery.callback.AbstractAjaxCallback.run(AbstractAjaxCallback.java:998)
                                         at android.os.Handler.handleCallback(Handler.java:739)
                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                         at android.os.Looper.loop(Looper.java:135)
                                         at android.app.ActivityThread.main(ActivityThread.java:5254)
                                         at java.lang.reflect.Method.invoke(Native Method)
                                         at java.lang.reflect.Method.invoke(Method.java:372)
                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我的代码如下所示。

public class MainActivity extends AppCompatActivity {

AQuery aq;

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

    aq = new AQuery(this);

    /*Button b = (Button)findViewById(R.id.button);
    b.setText("new text");
    b.setBackgroundColor(Color.RED);
    b.setEnabled(true);*/

    aq.id(R.id.button).clicked(this, "clickhandle");
}

    public void clickhandle(View view){

        ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("Loading Image");
        pd.setMessage("Please wait...");
    aq.id(R.id.button).text("aquery text").backgroundColor(Color.RED).
            textColor(Color.YELLOW).enabled(true);
        //aq.id(R.id.imageView).progress(pd).image("http://static.panoramio.com/photos/large/127854802.jpg",true,true,0,0,null,AQuery.FADE_IN);

        File f = new File(Environment.getExternalStorageDirectory(),"myfiles/myimage.jpg");
        if(!f.exists())

        try {
            f.mkdirs();
            f.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        aq.download("http://static.panoramio.com/photos/large/127854802.jpg", f, new AjaxCallback<File>(){

                @Override
                public void callback(String url, File object, AjaxStatus status) {
                    super.callback(url, object, status);
                    handfile(object);
                }
            });


    }

        private void handfile(File object) {
            Toast.makeText(this,"got file: " +object.getAbsolutePath().toString(),Toast.LENGTH_LONG).show();
        }

}

第 69 行对应于 handlefile(...) 方法中的 Toast 消息。

可能出了什么问题?

我在清单文件中声明了 WRITE_EXTERNAL_STORAGE 和 INTERNT 权限。

谢谢。

【问题讨论】:

  • 这是一个NPE,检查object != null
  • 我做的好像(!f.exists())...
  • 由于某种原因,当您调用handfile 时,文件为空
  • 我知道。我声明的文件对象没有传递给handlefile(...)方法的参数。

标签: android image storage aquery


【解决方案1】:

我发现的问题是您在目录myfiles 内创建了文件myimage.jpg,但该目录不存在。在创建文件之前尝试创建目录结构。

File f = new File f = new File(Environment.getExternalStorageDirectory(),"myfiles/myimage.jpg");

if(!f.exists())
    try {
        f.getParentFile().mkdirs(); //create missing parents
        f.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }

希望对你有帮助

【讨论】:

  • 我在 File f = new File(Environment.....) 之前放了一个断点,我从调试器中得到了这个:'/storage/emulated/0/myfiles/myimage.jpg'。所以我明白你的意思。但在创建实际文件之前,我不知道如何创建目录结构。
  • 看我的回答,f.getParentFile().mkdirs()
  • 不幸的是,我有同样的问题:(
  • @Theo 只需将f.getParentFile().mkdirs() 放在f.createNewFile() 之前。请在答案中注意这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
相关资源
最近更新 更多